我有一个文件,其中包含字符串中的名称列表,例如:
(约翰|玛丽|鲍勃)(安德森|布鲁克斯|库克)
我正在尝试使用正则表达式以字符串形式提取数据,例如:
约翰·安德森 约翰·布鲁克斯 约翰·库克 玛丽·安德森 玛丽·布鲁克斯 玛丽·库克 鲍勃·安德森 鲍勃·布鲁克斯 鲍勃·库克
我在 RegEx 相当新,所以任何帮助都会得到赞赏。谢谢
这不是你可以用正则表达式做的事情。正则表达式引擎匹配文本,它们不能对它们进行笛卡尔积。当然,您可以使用正则表达式开始。让我们看看 - 在 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']
看起来您的源文件已经是正则表达式形式,所以您的问题基本上只是生成与该正则表达式匹配的字符串。
查看这个问题以获得一些建议:Reversing a regular expression in Python
单独的正则表达式不能完全做到这一点。一般来说,正则表达式引擎只会匹配您输入中的一个特定位置(例如第一个可能的匹配) - 或者可能根本不匹配 - 所以您需要一个循环来迭代,直到所有输入都被消耗或模式没有更长的比赛。
循环可以是显式的(如 while(true){}),也可以是隐式的,如 Tim 的示例。您没有说您使用的是什么语言和/或工具,因此很难具体说明——正则表达式支持各不相同。在 Tim 的示例中,循环由 split() 和 findall() 方法隐式提供。Perl 的 split() 也提供了一个隐式循环。