2013-10-23 151 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()也提供了一個隱式循環。