Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 提取维基百科链接,正则表达式_Python_Regex - Fatal编程技术网

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

Python 提取维基百科链接,正则表达式,python,regex,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) 如何将我的正则表达式更改为不获取右括号如果没有左括号从正则表达式中

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

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

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
模块解决)。但是,由于您正在查找wikipedia URL,因此可以假设您不会找到这种格式,而只会找到带有一级平衡括号的URL,如:
http://en.wikipedia.org/wiki/Python_(编程语言)

想法很简单,调整您的模式,只允许在此上下文中使用括号(1级,平衡):


注意:我已经删除了似乎不太有用的
(?:"e)?
,但如果需要,您可以将其放入。在这种情况下,您必须使用
(?=([/!@i^*$a-z0-9_-]+)\2将行
[!@i^*$a-z0-9_-]+
更改为和阻止。

考虑使用XPath执行此任务,regex可以做很多事情,但XPath在XML文档的值方面是真正的专家。Python还提供了
urlparse
,这可以帮助您解析部分URL。为什么在Wikipedia中只考虑以
http
开头的字符串链接?您能否提供示例数据如果只给你一个普通字符串(除了测试你提取的链接),你真的无法确定一个链接是否应该有一个后括号。有一些惯例,你会有适当的匹配论题,但没有什么能阻止我在我的文章标题中加入随机的
。如果您正在解析
href
属性,则情况就不同了,但我假设情况并非如此。
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
    )"""