Python 正则表达式。删除 ':' 之后的所有字符(包括行尾和特定字符串除外)

Posted

技术标签:

【中文标题】Python 正则表达式。删除 \':\' 之后的所有字符(包括行尾和特定字符串除外)【英文标题】:Python regex. Removing all characters after ':' (including at the end of line and except for a specific string)Python 正则表达式。删除 ':' 之后的所有字符(包括行尾和特定字符串除外) 【发布时间】:2018-08-06 09:05:03 【问题描述】:

我正在解析日志文件中的信息和布局数据。假设我有一些看起来像这样的行:

图书:190 已借阅:ABCD-1234-E5F6,状态:LATE 返回:02.20.2018

我正在尝试删除特定于该行的信息,例如数字、序列号、日期等。但是,说“状态:迟到”应该保留。我想要这样的输出:

图书签出者,状态:延迟归还

(这个例子是编造的,结合实际的数据和任务有点意思。)

目前我有:re.sub(':\s.*?(?=[^A-Z\d\-.])','', str) 删除“:”后面不是大写字母、数字和“。”的所有字符或“-”(它停在其他任何地方,如空格、a-z 等)。但是,我的输出将保留最后一位并删除状态。

图书签出者,状态:返回:10.20.2018

    如何指定删除“:”后面的所有大写字母,但单词“LATE”除外 缺少什么也会删除行尾的数字?

【问题讨论】:

:\s*(?!LATE)[\w-.]+(?=[\s,]|$):\s*(?!LATE)\S+?(?=[\s,]|$) 怎么样? 你说这个例子是虚构的——你能澄清一下它实际上代表了你实际使用的数据吗?另外 - 你最终想要的输出是什么? 第二个来自 ctwheels 的作品!谢谢。 @JonClements - 我正在为审计日志做 QA,并确保某些事件确实被记录下来。我正在尝试删除特定于特定测试用例的数字和数据(产品序列号、IP 地址等),这样我就只剩下一般事件来区分预期的输出了。 啊,好吧...只是想知道解析该行是否有意义,然后删除识别信息...或者,如果您知道您要查找的内容-那么只需专门查找即可。 .. 【参考方案1】:

re.sub 带有负前瞻以使 LATE 不匹配:

re.sub(r':\s(?!LATE)[A-Z\d.-]+', '', str_)

:\s 匹配 : 后跟一个空格

(?!LATE) -- 零宽度负前瞻确保LATE 不会出现在以下匹配中

[A-Z\d.-]+ 匹配一个或多个[A-Z\d.-]

示例:

In [41]: str_ = 'Book: 190 Checked Out By: ABCD-1234-E5F6, Status: LATE Return: 02.20.2018'

In [42]: re.sub(r':\s(?!LATE)[A-Z\d.-]+', '', str_)
Out[42]: 'Book Checked Out By, Status: LATE Return'

【讨论】:

谢谢。我认为这正是我需要的方式。

以上是关于Python 正则表达式。删除 ':' 之后的所有字符(包括行尾和特定字符串除外)的主要内容,如果未能解决你的问题,请参考以下文章

notepad++正则表达式删除某行某字符开始之前或者之后所有字符

使用 Python 删除所有匹配正则表达式的行

Python正则表达式删除所有方括号及其内容

Python 正则表达式 - 删除所有“。”和特殊字符,小数点除外

括号之间的Python正则表达式替换[重复]

删除python注释的正则表达式[重复]