我对regex.
这个世界还很陌生,因此,如果这听起来很基本,我很抱歉。我已经读完了regex社区和Lopez关于为Python掌握regex的书,以确保我没有发布初学者级别的问题。你知道吗
我已经从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)强制regex不选择:
^/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
我真诚地感谢你的帮助。提前谢谢。你知道吗
试试regex
^\/wiki\/[^:]*?$
它将匹配以
/wiki/
开始的字符串,然后这个[^:]*?
将匹配没有:
的字符,直到$
结束在正则表达式中,
^/wiki/.*[^:].*$
,有两个.*
,因此:
将与任何一个.*
一起逃逸。因此,[^:]*
将足以捕获所有内容Regex
你的正则表达式是错误的。你知道吗
解析如下:
^
:匹配行的开头/wiki/
:匹配文字序列/wiki/
.*
:匹配任意字符的零个或多个[^:]
:匹配任何不是:
.*
:匹配任意字符的零个或多个所以它
/wiki/
(确定):
的字符”,只要最后一个字符不是:
(嗯…)因此您的正则表达式最终匹配整行,因为
.*
,除了在末尾之外,甚至从不检查:
。你知道吗现在看看正确的表达式是做什么的
^
:匹配行的开头/wiki/
:匹配文字序列/wiki/
[^:]+
:匹配一个或多个不是:
的内容$
:匹配行尾/wiki/
(确定):
,在这种情况下它失败希望这能帮助你更好地解决问题。我强烈推荐https://www.regex101.com用于构建和测试正则表达式(它有一个与Python兼容的regex模式),因为它还包含了对regex引擎一步一步执行的操作的解释。你知道吗
编辑:回答你的第二个问题,我认为没有其他合理的方法来构造这个表达式。不要使用lookaheads或量词,这不是它的目的。你知道吗
相关问题 更多 >
编程相关推荐