提取维基百科链接,正则表达式

时间:2014-05-26 12:59:52

标签: python regex

我是新手程序员并且正则表达式存在问题。 我有大文件和帖子,我想提取维基百科链接。

现在我有这个正则表达式:

wiki = 'http[s]?://([a-zA-Z.0-9]{,3}wikipedia.org/wiki/[/!@i^*$a-zA-Z0-9_()-]*)(?:&quot)?'

它工作正常但有时会产生如下结果:

en.wikipedia.org/wiki/Euclidean_algorithm)

如果没有左括号,如何将我的正则表达式更改为不获取右括号

2 个答案:

答案 0 :(得分:0)

从正则表达式中省略括号,然后添加一个带有开括号和近括号的变量。从理论上讲,你可能需要两个或更多,但我认为维基百科不允许在标题中使用多个。

wiki1 = 'http[s]?://([a-zA-Z.0-9]{,3}wikipedia.org/wiki/[/!@i^*$a-zA-Z0-9_-]*)(?:&quot)?'
wiki2 = 'http[s]?://([a-zA-Z.0-9]{,3}wikipedia.org/wiki/[/!@i^*$a-zA-Z0-9_-]*\([/!@i^*$a-zA-Z0-9_-]*\)[/!@i^*$a-zA-Z0-9_-]*)(?:&quot)?'
wiki = wiki1 + '|' + wiki2

答案 1 :(得分:0)

没有什么禁止构建包含不平衡或嵌套括号的URL(这种情况不能通过re模块解决,但可以使用regex模块解决)。但是,由于您正在寻找维基百科网址,因此您可以假设您不会找到这种格式,只能使用单一级别的平衡括号,例如:http://en.wikipedia.org/wiki/Python_(programming_language)

这个想法很简单,只允许你的模式在这种情况下允许括号(1级,平衡):

wiki = r"""(?ix)                       # case insensitive & verbose mode
    https?://                          # perhaps you should make this optional?
    (
        [a-z0-9.]{,3}                  # 
        wikipedia.org/wiki/
        (?:
            [/!@i^*$a-z0-9_-]+         # part without parenthesis
          |                            # OR
            [(] [/!@i^*$a-z0-9_-]+ [)] # part between parenthesis
        )*                             # repeat the group 0 or more times
    )"""

注意:我删除了(?:&quote)?似乎没用的内容,但如果需要,可以将其添加。在这种情况下,您必须将行[/!@i^*$a-z0-9_-]+(不带括号的部分)更改为(?=([/!@i^*$a-z0-9_-]+))\2emulate an atomic group,并阻止catastrophic backtracking