【问题标题】:Simple Python Regex Substitution简单的 Python 正则表达式替换
【发布时间】:2016-07-04 17:09:43
【问题描述】:

我正在尝试使用 python 中的 re.sub() 函数更改 url 的一部分。我以为这很简单,但它似乎并没有以任何方式修改我的测试字符串。

我有:

line = '        <h3><a href="40_On-Site_Storage_High_Lift_Pumping_Caustic_Storage/31-BUV-4021/DETAILS/31-BUV-4021.pdf" target="'

out_line = re.sub(r'href="[\w,_]*/','href="30_Actiflo_and_Filters/', line)

当我打印 out_line 时,我会得到完全相同的字符串。我的意图是将 'href="' 和 '/' 之间的部分替换为 '30_Actiflo_and_Filters'。

谢谢,

【问题讨论】:

  • 您想将href 替换为最后一个/ 还是第一个/?而且我在字符类中看到一个逗号,显然你的字符串中没有逗号,所以它不会匹配任何东西。
  • 第一个/。即使没有逗号,它也不起作用。

标签: python regex python-2.7 url


【解决方案1】:

out = re.sub(r'href=".*?/', 'href="30_Actiflo_and_Filters/', line) 为我工作。

【讨论】:

  • 谢谢!任何人都知道为什么 \w 与我预期的不匹配(任何字母数字字符)?
  • _ 不是字母数字字符,正如@Psidom 在评论中所说,您的字符串中没有任何逗号,因此不会有任何匹配项。句点匹配任何字符,我使用? 匹配第一个/
【解决方案2】:

您的正则表达式不起作用的原因是您的 url 包含字符 - 不包括在内,而且您不需要在字符类中使用逗号,因此 [\w_-]* 应该可以正常工作:

re.sub(r'href="[\w_-]*/','href="30_Actiflo_and_Filters/', line)
# '        <h3><a href="30_Actiflo_and_Filters/31-BUV-4021/DETAILS/31-BUV-4021.pdf" target="'

如果要匹配第一个/,使用排除^ 字符会更方便:

re.sub(r'href="[^/]*/','href="30_Actiflo_and_Filters/', line)
# '        <h3><a href="30_Actiflo_and_Filters/31-BUV-4021/DETAILS/31-BUV-4021.pdf" target="'

【讨论】:

    【解决方案3】:

    这是一个简单而甜蜜的解决方案:

    outline = re.sub(r'(is)href="(.*?)/','30_Actiflo_and_Filters/',str(line))
    

    由于您的目标字符串是字母数字,\w 将无济于事。你可以试试[0-9a-zA-Z]*

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-22
      • 2012-06-17
      • 1970-01-01
      相关资源
      最近更新 更多