使用正则表达式解析列表

时间:2013-10-23 20:45:26

标签: regex parsing

我有一个文件,其中包含以下字符串中的名称列表:

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

我正在尝试使用正则表达式将数据拉出来,如:

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

我在RegEx相当新,所以任何帮助都会受到重视。感谢

3 个答案:

答案 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']

答案 1 :(得分:0)

看起来您的源文件已经是正则表达式形式,所以您的问题基本上只是生成与该正则表达式匹配的字符串。

请查看此问题以获取一些建议:Reversing a regular expression in Python

答案 2 :(得分:0)

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

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