【问题标题】: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

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

【问题讨论】:

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

标签: python regex parsing python-3.5


【解决方案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'

【讨论】:

  • 谢谢。我认为这正是我需要的方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-11
  • 2011-09-08
  • 2014-01-10
  • 1970-01-01
  • 1970-01-01
  • 2020-02-16
相关资源
最近更新 更多