2013-10-23 101 views
0

我有一个名称列表中的文件,例如字符串列表:解析使用正则表达式

(约翰|玛丽|鲍勃)(安德森|布鲁克斯|库克)

我试图使用正则表达式来提取数据出来像字符串:

约翰·安德森 约翰·布鲁克斯 约翰库克 玛丽·安德森 玛丽·布鲁克斯 玛丽库克 鲍勃·安德森 鲍勃·布鲁克斯 鲍勃库克

我在RegEx是相当新的,所以任何帮助将被折扣。谢谢

+0

到目前为止您尝试了什么? –

回答

3

这不是你可以用正则表达式做。正则表达式引擎匹配文本,他们不能做笛卡尔产品。当然,你可以使用正则表达式来开始。让我们看看 - 在Python中,我会这么做

>>> import itertools 
>>> import re 
>>> s = "(John|Mary|Bob)(Anderson|Brooks|Cook)" 
>>> names = [name.split("|") for name in re.findall(r"\(([^()]*)\)", s)] 
>>> names 
[['John', 'Mary', 'Bob'], ['Anderson', 'Brooks', 'Cook']] 
>>> [" ".join(item) for item in itertools.product(*names)] 
['John Anderson', 'John Brooks', 'John Cook', 'Mary Anderson', 'Mary Brooks', 
'Mary Cook', 'Bob Anderson', 'Bob Brooks', 'Bob Cook'] 
0

仅靠正则表达式无法完成此任务。通常情况下,正则表达式引擎只会匹配输入中的一个特定位置(比如第一个可能的匹配) - 或者根本没有 - 所以需要一个循环来迭代,直到所有输入被消耗或者模式为no更长的比赛。

与Tim的示例一样,循环可以是显式的(如while(true){}),也可以是隐式的。 你没有说你正在使用什么语言和/或工具,所以它很难具体 - 正则表达式支持各不相同。在Tim的例子中,循环是由split()和findall()方法隐式提供的。 Perl的split()也提供了一个隐式循环。