我是新手程序员并且正则表达式存在问题。 我有大文件和帖子,我想提取维基百科链接。
现在我有这个正则表达式:
wiki = 'http[s]?://([a-zA-Z.0-9]{,3}wikipedia.org/wiki/[/!@i^*$a-zA-Z0-9_()-]*)(?:")?'
它工作正常但有时会产生如下结果:
en.wikipedia.org/wiki/Euclidean_algorithm)
如果没有左括号,如何将我的正则表达式更改为不获取右括号
答案 0 :(得分:0)
从正则表达式中省略括号,然后添加一个带有开括号和近括号的变量。从理论上讲,你可能需要两个或更多,但我认为维基百科不允许在标题中使用多个。
wiki1 = 'http[s]?://([a-zA-Z.0-9]{,3}wikipedia.org/wiki/[/!@i^*$a-zA-Z0-9_-]*)(?:")?'
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_-]*)(?:")?'
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
)"""
注意:我删除了(?:"e)?
似乎没用的内容,但如果需要,可以将其添加。在这种情况下,您必须将行[/!@i^*$a-z0-9_-]+
(不带括号的部分)更改为(?=([/!@i^*$a-z0-9_-]+))\2
并emulate an atomic group,并阻止catastrophic backtracking。