【问题标题】:Python remove whitespace from regex substring match in filePython从文件中的正则表达式子字符串匹配中删除空格
【发布时间】:2020-01-15 11:49:57
【问题描述】:

我正在读取一个文件并尝试用该匹配替换每次出现的正则表达式匹配,但去掉空格。例如,在我的文档中正确匹配我想要的内容的正则表达式是 '([0-9]+\s(st|nd|rd|th))' 以便表单文档中的任何内容......

将匹配第 1、第 2、第 33、第 134 等。

我想要的是简单地编写一个新文件,将原始文件中的每个出现替换为删除的空白。

我玩过一些类似 re.findall 和 re.sub 的东西,但我不知道如何编写完整的文档,但只替换了没有空格的子字符串匹配项。

感谢您的帮助。

【问题讨论】:

  • etc 是什么意思?

标签: python regex replace


【解决方案1】:

如果我理解正确,您可以使用re.sub 来实现此目的。

不要在整个模式周围放置一个捕获组,而是在数字周围放置一个,在所选文本周围放置另一个,省略空格。

>>> import re
>>> text = 'foo bar 1 st, 2 nd, 33 rd, 134 th baz quz'
>>> re.sub(r'([0-9]+)\s+(st|nd|rd|th)\b', '\\1\\2', text)

另一种方法是使用lookarounds

>>> re.sub(r'(?<=[0-9])\s+(?=(?:st|nd|rd|th)\b)', '', text)

输出

foo bar 1st, 2nd, 33rd, 134th baz quz

【讨论】:

    【解决方案2】:

    替换为删除的空白。

    尝试使用Non-capturing group

    (?:\d+)\s+(?:(st|nd|rd|th))
    

    Online demo

    上面的正则表达式将捕获数字之间的空格,然后是 st,nd,rd,th 中的任何一个。现在只需用空字符串替换所有空格。

    【讨论】:

      【解决方案3】:

      另一个不捕获组的技巧。您需要在正则表达式中添加单词边界以仅匹配数字与 st 或 nd 或 ed 或 th 字符串之间的空格。在替换部分,将匹配的空格替换为空字符串(即通过re.sub删除匹配的空格)

      >>> import re
      >>> text = 'foo 1 st, 2 nd, 33 rddfa,33 rd,bar 134 th'
      >>> re.sub(r'(?<=\d)\s+(?=(?:st|nd|rd|th)\b)', r'', text)
      'foo 1st, 2nd, 33 rddfa,33rd,bar 134th'
      

      DEMO

      【讨论】:

      • 为什么同时使用 (?=(?:))
      猜你喜欢
      • 2018-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多