【发布时间】:2018-09-21 22:47:34
【问题描述】:
我是regex. 世界的新手,因此,如果这听起来很简单,我很抱歉。我已阅读完 regex 社区和 Lopez 关于 Mastering regex for Python 的书,以确保我不会发布初学者级别的问题。
我已经从 wiki 中抓取数据(用于学习),我正在尝试提取字符串
a) 以\wiki 开头的
b) 不包含:
这是正文:
/wiki/Template:Kevin_Bacon
/wiki/Category:Best_Miniseries_or_Television_Movie_Actor_Golden_Globe_winners
/wiki/Al_Pacino
/wiki/Paul_Giamatti
/wiki/Kevin_Costner
/wiki/Kevin_Costner
/wiki/Michael_Douglas
/wiki/Mark_Ruffalo
/wiki/Idris_Elba
/wiki/Bryan_Cranston
/wiki/Alexander_Skarsg%C3%A5rd
/wiki/Biblioteca_Nacional_de_Espa%C3%B1a
/wiki/Template:Kevin_Bacon
https://hy.wikipedia.org/wiki/%D5%94%D6%87%D5%AB%D5%B6_%D4%B2%D5%A5%D5%B5%D6%84%D5%B8%D5%B6
输出必须分组,即我应该得到这些字符串的列表(或元组):
/wiki/Al_Pacino
/wiki/Paul_Giamatti
/wiki/Kevin_Costner
/wiki/Kevin_Costner
/wiki/Michael_Douglas
/wiki/Mark_Ruffalo
/wiki/Idris_Elba
/wiki/Bryan_Cranston
/wiki/Alexander_Skarsg%C3%A5rd
/wiki/Biblioteca_Nacional_de_Espa%C3%B1a
这是我提取字符串的尝试:
a) 使用负前瞻:
这个想法是不选择后面跟着:的字符串
r^/wiki/.*(?!:).*
但是,上面的代码仍然选择带有: 的字符串,即/wiki/Template:Kevin_Bacon
b) 强制正则表达式不选择 :
^/wiki/.*[^:].*
但是,上面的代码仍然选择带有: 的字符串,即/wiki/Template:Kevin_Bacon
c) 使用量词指定: 应该出现零次
^/wiki/.*:{0}.*$
但是,上面的代码仍然选择带有: 的字符串,即/wiki/Template:Kevin_Bacon
我有两个问题:
a) 我真的很喜欢regex。有人可以解释一下上述尝试有什么问题吗?
b) 如何使用上述方法解决问题?
我将在 python 中使用regex 模块。根据 SO 的指导方针,我尝试在 regex101 网站上调试 regex。这是链接:https://regex101.com/r/Wt40Cz/1
我真诚地感谢任何帮助。提前致谢。
【问题讨论】:
-
试试
^\/wiki\/[^:]+?$ -
非常感谢。您介意解释一下为什么在“冒号排除”之前和之后删除了
.*,即[^:]。我正在努力学习逻辑。提前致谢。 -
@ZaphoOxx 不,你没有
-
@Zapho:我不这么认为,因为我在 python 中使用原始字符串表示法:
r" " -
@watchtower:当您尝试匹配正则表达式时,它会尝试以任何方式匹配输入文本。这个 .* 在你的正则表达式中实际上也匹配 : 因为哪些行也被选中了 : 。您只需要稍微更正您的正则表达式,就像已经说过的 ran_0315 并将其修改为 ^/wiki/[^:]+$ 这将匹配 /wiki/ 后跟任何字符,除了 : 它在 /wiki/ 之后找到一个 : 的那一刻拒绝输入文本