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



我是一个新手程序员,有问题与正则表达式。我有一个大文件的帖子,我想提取维基百科的链接。

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

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

可以正常工作,但有时会出现如下结果:

en.wikipedia.org/wiki/Euclidean_algorithm)

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

从正则表达式中去掉括号,然后添加一个带有开括号和闭括号的变体。理论上,你可能需要两个或更多的标题,但我认为维基百科不允许超过一对标题。

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

没有禁止构建包含不平衡或嵌套括号的url(这种情况不能用re模块解决,但可以用regex模块解决)。然而,由于您正在寻找维基百科的url,您可以假设您不会找到这种格式,而只会找到带有单个平衡括号的url,例如: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_-]+))2,以模拟原子组并防止灾难性的回溯。

最新更新