【问题标题】:Python Regex sub()Python 正则表达式 sub()
【发布时间】:2018-09-27 14:52:23
【问题描述】:
agentNamesRegex = re.compile(r'Agent (\w)\w*') 

agentNamesRegex.sub(r'\1****', 'Agent Alice told Agent Carol that Agent Eve knew Agent Bob was a double agent.') 

A**** told C**** that E**** knew B**** was a double agent.'

所以我正在学习 python 并需要上述正则表达式的帮助。请纠正我,但'\1' 用于捕获第一个单词。两个问题:

  1. 为什么需要括号
  2. 为什么当我将上面的行更改为时它不起作用:

    agentNamesRegex = re.compile(r'Agent (\w)(\w)(\w)(\w)(\w)(\w)(\w)(\w)\w*') 
    
    agentNamesRegex.sub(r'\3****', 'Agent Alice told Agent Carol that Agent Eve knew Agent Bob was a double agent.') 
    

我想我首先不理解(\w)\1 的概念。你能帮忙吗?我没有想到任何具体的输出,但在蜘蛛中尝试不同的东西以更好地了解正则表达式并理解上述表达式。

【问题讨论】:

    标签: python python-3.x regex


    【解决方案1】:

    为什么需要括号

    括号用于捕获一组字符。 \1 返回第一个捕获的组。在正则表达式r'Agent (\w)\w*' 中,(\w) 周围的括号捕获'Agent ' 之后的第一个单词字符,这是代理名称的第一个字母。然后将捕获的字母替换回输出中,代替每个匹配子字符串的 \1

    为什么当我将上面的行更改为时它不起作用:

    agentNamesRegex = re.compile(r'Agent (\w)(\w)(\w)(\w)(\w)(\w)(\w)(\w)\w*')
    

    该正则表达式正在查找单词“Agent”,后跟一个空格,然后是 8 个或更多单词字符。您的输入字符串中没有任何内容与该模式匹配。 (你的代理名字太短了。)

    【讨论】:

    • 如果没有与模式匹配,为什么输出“Alice 特工告诉 Carol 特工 Eve 知道特工 Bob 是双重间谍”而不是“无”。如果模式不匹配,输出不应该是 None。
    • @Abhi 因为你打电话给sub。由于该模式没有匹配项,sub 不会进行任何替换,因此您的输出字符串与输入字符串相同。
    • 非常感谢您的帮助!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 2017-11-13
    相关资源
    最近更新 更多