【问题标题】:Regular Expressions task正则表达式任务
【发布时间】:2023-03-12 23:06:01
【问题描述】:

以下是我需要解析的文本文件示例。

Lead Attorney: John Doe
Staff Attorneys: John Doe Jr. Paralegal: John Doe III
Geographic Area: Wisconsin
Affiliated Offices: None
E-mail: blah@blah.com

我需要解析所有键/值对并将其导入数据库。例如,我将在 [Lead Attorney] 列中插入“John Doe”。我启动了一个正则表达式,但在解析第 2 行时遇到了问题:

Staff Attorneys: John Doe Jr. Paralegal: John Doe III

我从以下正则表达式开始:

(\w*.?\w+):\s*(.)(?!(\w.?\w+:.*))

但这并不能解析出“Staff Attorneys: John Doe Jr.”和“律师助理:约翰·多伊三世”。即使键/值对在同一行,如何确保我的正则表达式为每个键/值对返回两个组?谢谢!

【问题讨论】:

  • 没有办法,除非你假设第二个键只有一个单词。否则我们怎么知道关键是“Paralegal”还是“Jr.”。律师助理?
  • 您事先知道所有可能的键吗?在这种情况下,可以使用 (paralegal|junior paralegal|junior associate) 之类的东西。
  • 这就是为什么我试图使用 Negative Lookahead 来防止另一个键被匹配 '(?!(\w.?\w+:.*))'...
  • @amicitas,不,我事先不知道所有可能的键。在该示例中,键是:首席律师、职员律师、律师助理、地理区域、附属办公室和电子邮件。 “John Doe III”将被导入律师助理。
  • 有多少行中有两个 : 实例?为什么不直接解析文件,忽略您确定的每一行,然后吐出不确定解析的列表,以便您可以手动编辑它们,然后使用固定版本再次运行它?

标签: regex python-3.x


【解决方案1】:

是否有任何类型的键作为第二键出现?上面的文本可以通过先执行data.replace('Paralegal:', '\nParalegal:') 来修复。然后每行只有一个键/值对,它变得微不足道:

>>> data = """Lead Attorney: John Doe
... Staff Attorneys: John Doe Jr. Paralegal: John Doe III
... Geographic Area: Wisconsin
... Affiliated Offices: None
... E-mail: blah@blah.com"""
>>> 
>>> result = {}
>>> data = data.replace('Paralegal:', '\nParalegal:')
>>> for line in data.splitlines():
...     key, val = line.split(':', 1)
...     result[key.strip()] = val.strip()
... 
>>> print(result)
{'Staff Attorneys': 'John Doe Jr.', 'Lead Attorney': 'John Doe', 'Paralegal': 'John Doe III', 'Affiliated Offices': 'None', 'Geographic Area': 'Wisconsin', 'E-mail': 'blah@blah.com'}

如果 "Paralegal:" 也首先出现,您可以创建一个正则表达式来仅在它不是第一个时进行替换,或者创建一个 .find 并检查前面的字符是否不是换行符。如果有几个关键词可以这样出现,可以做一个关键词列表等。

如果关键字可以是任何东西,但只能是一个单词,则可以查找 ':' 并向后解析空格,这可以通过正则表达式来完成。

如果关键字可以是任何内容并且包含空格,则无法自动执行。

【讨论】:

  • Lennart,抱歉耽搁了,但您的回复完成了我使用 Python 完成的任务,谢谢。出于学习目的,我仍然必须找到一种方法来使用正则表达式完成相同的操作(如果可能)。在我看来,这可以在 RegEx 中完成。感谢大家的投入!
  • 仅仅因为它可以在正则表达式中完成并不意味着它应该。 :)
猜你喜欢
  • 2013-06-05
  • 1970-01-01
  • 2011-06-23
  • 2017-02-03
  • 2015-12-29
  • 1970-01-01
  • 1970-01-01
  • 2020-07-29
  • 1970-01-01
相关资源
最近更新 更多