【问题标题】:How to remove a word if it has more than 2 occurrence of a given character in python?如果在python中出现超过2次给定字符,如何删除一个单词?
【发布时间】:2020-08-28 04:48:50
【问题描述】:

我正在解析一个日志文件,其中包含如下行:

Pushing the logs into /var/log/my_log.txt
Pushing the logs into /opt/test/log_file.txt

这些行多次出现并带有自动生成的路径(/.../.../...)

我想将其更改为通用形式,例如:

 Pushing the logs into PATH

我尝试使用正则表达式选择带有多个正斜杠的单词,然后将其替换为单词“PATH”,如下所示:

line = re.sub(r'\b([\/A-Z]*\/[A-Z]*){1,}\b',' PATH ',line)

只有正斜杠被替换,而不是整个单词。

对这个概念非常陌生。难道我做错了什么?感谢所有帮助。谢谢。

【问题讨论】:

  • 试试,re.sub("/.*", 'PATH', line)

标签: python regex parsing


【解决方案1】:

你可以使用:

import re

line = 'Pushing the logs into /var/log/my_log.txt'

pat = r'(?<!\S)(/\S+){2,}'

line = re.sub(pat, 'PATH', line)

print(line)

这并没有完全按照说明进行回答,因为它查找的“单词”必须/ 开头 并且还包含两个 或更多/(带有每个/) 后面的其他非空白字符 - 所以它会覆盖例如/tmp/my_log.txt。我认为这更好地涵盖了您会发现的那种字符串——如果它们是绝对路径,那么 / 将始终是第一个字符,同样,如果它们是文件而不是目录,那么最后一个 / 将不在最后(尽管我没有费心排除最后一个/,前提是它之前至少还有两个)。如果您只想寻找例如3 个或更多 /(不是在末尾),然后将 2 更改为 3,但如果这样做,您将错过 /tmp/my_log.txt

正则表达式(?&lt;!\S) 的第一位是否定的lookbehind 断言,意思是“前面没有非空白字符”,即它将匹配“单词”的开头或行的开头。下一位 (/\S+) 表示 / 后跟一个或多个非空白字符(可以包括 / - 没关系,所以我懒得排除这些)。而{2,} 表示应该有两个或多个。

(我在问题中使用“单词”来指代非空白字符的序列,不一定是字母。)

【讨论】:

    【解决方案2】:

    只匹配正斜杠,因为字符串是小写的,并且该模式使用[\/A-Z]*匹配正斜杠或大写字符 A-Z 零次或多次

    您可以使用re.IGNORECASE 使模式不区分大小写,但它不会匹配示例数据中的下划线和点。

    当您以单词边界 \b 开始模式时,第一个正斜杠不匹配,但空格和第一个正斜杠之间没有单词边界。

    更具体的匹配可能是使用\w 匹配单词字符并指定扩展名的点:

    (?<!\S)(?:/\w+)+/\w+\.\w+(?!\S)
    
    • (?&lt;!\S) 向左声明空白边界
    • (?:/\w+)+ 匹配 1 次或多次 / 后跟 1+ 个单词字符
    • /\w+\.\w+ 匹配最后一个 / 后跟使用点和单词字符的文件名格式
    • (?!\S) 断言右边的空白边界

    查看regex demo | Python demo

    import re
    
    line = 'Pushing the logs into /var/log/my_log.txt'
    line = re.sub(r'(?<!\S)(?:/\w+)+/\w+\.\w+(?!\S)', 'PATH', line)
    print(line)
    

    输出

    Pushing the logs into PATH
    

    更广泛的模式可以匹配正斜杠的 2 倍,并使用否定字符类来匹配除正斜杠或换行符之外的任何字符

    (?<!\S)(?:/[^/\r\n]+){2,}
    

    查看另一个regex demo

    【讨论】:

      猜你喜欢
      • 2022-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-05
      • 1970-01-01
      • 1970-01-01
      • 2021-10-27
      • 2014-06-29
      相关资源
      最近更新 更多