2011-02-23 66 views

回答

4

我假设你有一个像[[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更具可读性(我碰巧认为它的意图 - 不捕捉 - 更清楚)。

0

尝试以下操作:(\[\[[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]]') 
0
>> a = "\[\[([A-Za-z]+)\]\] son of \[\[([A-Za-z]+)\]\]" 
>> p = re.compile(a) 
>> m = p.match("[[A]] son of [[B]]") 
>> m.groups() 
('A', 'B') 
1

我会回应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来遍历链接,然后找到那些在其周围环境中具有“子”的东西可能会很有用。这肯定会有助于各种特殊形式的链接不符合这套正则表达式。