使用Python regex忽略字符串中的“:”

2024-06-02 07:06:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我对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

我真诚地感谢你的帮助。提前谢谢。你知道吗


Tags: 字符串代码wikitemplateregexmarkalbacon
2条回答

试试regex ^\/wiki\/[^:]*?$

它将匹配以/wiki/开始的字符串,然后这个[^:]*?将匹配没有:的字符,直到$结束

在正则表达式中,^/wiki/.*[^:].*$,有两个.*,因此:将与任何一个.*一起逃逸。因此,[^:]*将足以捕获所有内容

Regex

你的正则表达式是错误的。你知道吗

^/wiki/.*[^:].*

解析如下:

  • ^:匹配行的开头
  • /wiki/:匹配文字序列/wiki/
  • .*:匹配任意字符的零个或多个
  • [^:]:匹配任何不是:
  • .*:匹配任意字符的零个或多个

所以它

  1. 匹配行的开头(确定)
  2. 匹配文字/wiki/(确定)
  3. 匹配整个线路的其他部分(哦)
  4. 回溯一个字符并匹配“任何不是:的字符”,只要最后一个字符不是:(嗯…)
  5. 不匹配任何字符,即任何字符的零个或多个

因此您的正则表达式最终匹配整行,因为.*,除了在末尾之外,甚至从不检查:。你知道吗

现在看看正确的表达式是做什么的

^\/wiki\/[^:]+$
  • ^:匹配行的开头
  • /wiki/:匹配文字序列/wiki/
  • [^:]+:匹配一个或多个不是:的内容
  • $:匹配行尾

    1. 匹配行的开头(确定)
    2. 匹配文字/wiki/(确定)
    3. 匹配行的其余部分,除非它包含一个:,在这种情况下它失败
    4. 匹配行的结尾

希望这能帮助你更好地解决问题。我强烈推荐https://www.regex101.com用于构建和测试正则表达式(它有一个与Python兼容的regex模式),因为它还包含了对regex引擎一步一步执行的操作的解释。你知道吗

编辑:回答你的第二个问题,我认为没有其他合理的方法来构造这个表达式。不要使用lookaheads或量词,这不是它的目的。你知道吗

相关问题 更多 >