我想取回两个不同的项目,而不在使用正则表达式的词语相匹配:比赛,但不能退货的正则表达式的两场比赛之间
[[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来遍历链接,然后找到那些在其周围环境中具有“子”的东西可能会很有用。这肯定会有助于各种特殊形式的链接不符合这套正则表达式。