我想取回兩個不同的項目,而不在使用正則表達式的詞語相匹配:比賽,但不能退貨的正則表達式的兩場比賽之間
[[A]] son of [[B]]
我想這會工作:
\[\[[A-Za-z\s]+\]\](?:(.*son of.*))\[\[[\|,A-Za-z\s]+\]\]
但它不是很工作。我怎麼能匹配A和B而不返回「兒子的」?
我想取回兩個不同的項目,而不在使用正則表達式的詞語相匹配:比賽,但不能退貨的正則表達式的兩場比賽之間
[[A]] son of [[B]]
我想這會工作:
\[\[[A-Za-z\s]+\]\](?:(.*son of.*))\[\[[\|,A-Za-z\s]+\]\]
但它不是很工作。我怎麼能匹配A和B而不返回「兒子的」?
我假設你有一個像[[Worf]] son of [[Mogh]]
一個字符串,從要 「迴歸」(即匹配)[[Worf]]
和[[Mogh]]
。要做到這一點,您需要捕獲圍繞想要捕獲的正則表達式部分(又名「返回」)的組(括號)。爲了不返回son of
,您還需要刪除您在其中的捕獲組(嵌套在(?:...)
之內)。
在代碼:
>>> s = '[[Worf]] son of [[Mogh]]'
>>> p = re.compile('(\[\[[A-Za-z\s]+\]\])(?:.*son of.*)(\[\[[\|,A-Za-z\s]+\]\])')
>>> print p.match(s).groups()
('[[Worf]]', '[[Mogh]]')
如果您使用的.groups()
方法來獲得匹配的部分,你也可以刪除非捕獲組圍繞.*son of.*
,這可能會使RE更具可讀性(我碰巧認爲它的意圖 - 不捕捉 - 更清楚)。
嘗試以下操作:(\[\[[A-Za-z\s]+\]\])(?:.*son of.*)(\[\[[\|,A-Za-z\s]+\]\])
p = re.compile(r"(\[\[[A-Za-z\s]+\]\])(?:.*son of.*)(\[\[[\|,A-Za-z\s]+\]\])")
m = p.match("[[A]] son of [[B]]")
print m.groups()
# ('[[A]]', '[[B]]')
>> a = "\[\[([A-Za-z]+)\]\] son of \[\[([A-Za-z]+)\]\]"
>> p = re.compile(a)
>> m = p.match("[[A]] son of [[B]]")
>> m.groups()
('A', 'B')
我會迴應dcrosta的答案,雖然我個人更喜歡使用命名捕獲。雖然使用名爲捕捉使得正則表達式本身有點難以閱讀,它可以讓你捕捉類似於字典的訪問:
>>> mw_string = "[[Duras]] son of [[Ja'rod]]"
>>> son_re = re.compile('\[\[(?P<son>[^\]]+)\]\](?:.*son of.*)\[\[(?P<parent>[^\]]+)\]\]')
>>> print son_re.match(mw_string).group("son")
Duras
>>> print son_re.match(mw_string).group("parent")
Ja'rod
使用名稱的優點捕捉的是,你可能會創建一整套各種使用regexen的,每一個都有一個你想以特定有意義的順序退出比賽的定義的參數集(例如,「[[Ja'rod]]的兒子[[Duras]]」)。
由於它看起來像是在解析MediaWiki,因此使用mwlib來遍歷鏈接,然後找到那些在其周圍環境中具有「子」的東西可能會很有用。這肯定會有助於各種特殊形式的鏈接不符合這套正則表達式。