Python从段落中提取信息

标签 python regex text text-extraction

我是 Python 新手,现在我正在尝试从一组包含员工相关统计数据的段落中提取信息。

例如,该段落可能如下所示:

Name Rakesh Rao Age 34 Gender Male Marital Status Single

整个文本没有用任何逗号分隔,所以我很难分隔这些信息。 有时变量名称后面可能有冒号,有时可能没有。例如,在第 1 行中,它是“Name Rakesh Rao”,但在第 2 行中它是“Name:Ramachandra Deshpande”

此信息大约有 1400 条记录,因此如果我不必手动分离这些信息,那就太好了。 有人能帮忙吗?我将非常感激!

最佳答案

嗯,我想你可以尝试使用正则表达式来做到这一点。 如果您的文字正是这样:

paragraph = 'Name Rakesh Rao Age 34 Gender Male Marital Status Single'

您可以使用此正则表达式(您必须先 import re):

m = re.fullmatch(
    (
    r'Name(?:\:)? (?P<name>\D+) '  # pay attention to the space at the end
    r'Age(?:\:)? (?P<age>\d+) '
    r'Gender(?:\:)? (?P<gender>\D+) '
    r'Marital Status(?:\:)? (?P<status>\D+)'  # no space here, since the string ends
    ),
    paragraph
)

然后您可以使用正则表达式中定义的组名称,如下所示:

>>> m.group('name')
'Rakesh Rao'
>>> m.group('age')
'34'
>>> m.group('gender')
'Male'
>>> m.group('status')
'Single'

如果所有字段都在一行中,则只需替换 \n正则表达式中包含一个空格。

请注意,这将支持紧跟在行名称之后的单个逗号,如下所示:

Name: Rakesh Rao

但不支持不同的数据顺序。如果您也愿意,我可以尝试编写不同的表达式。

表达式解释

让我们看一下表达式的第一“行”:

r'Name(?:\:)? (?P<name>\D+) '

首先,为什么 r'…'字符串语法?这只是为了避免双反斜杠。在“典型”字符串中,我们需要编写如下表达式:

'Name(?:\\:)? (?P<name>\\D+) '

现在,到实际的表达。第一部分,Name ,非常明显。

(?:\:)?

这部分创建一个非捕获组( (?:…) ),内部带有冒号 - 它是 \:不仅仅是: ,因为冒号本身是正则表达式语法的一部分。非捕获组,因为这个冒号对我们来说真的不重要。

然后,在一个空格之后,我们有这样的:

(?P<name>\D+)

这将创建一个命名组,语法为 (?P<name_of_the_group>…) 。我使用命名组只是为了以后更容易、更好地提取信息,使用 m.group('name') ,其中m是一个匹配对象。

\D+表示“至少一个非数字字符”。这会捕获所有字母、下划线以及空格。这就是为什么字段的顺序对于这个特定的表达式如此重要。如果您要更改顺序并输入 Gender Name之间的字段和Age ,它也会捕获它,因为 +修饰符是贪婪的。

另一方面,\d+下“行”中的意思是“至少一个数字字符”,因此在 0 到 9 之间。

我希望解释已经足够了,但是在这个非常有用的网站上使用这个表达式可能对您有用:

https://regex101.com/r/N5ZJU9/2

我已经为您输入了正则表达式和测试字符串。

关于Python从段落中提取信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58382488/

相关文章:

text - 自定义TextEdit,当它变宽时如何隐藏TextInput

python - 使用python matplotlib时如何更改图中所有文本的大小?

python - PySpark:当函数具有多个输出时

python - 套接字错误 : [Errno 111] when trying to connect to a socket

python - Matplotlib - 以对数刻度标记绘图的方向

Python .format 切片长字符串并添加点

C# - 删除与正则表达式匹配的行

Javascript 正则表达式到 Java 正则表达式

regex - Oracle查询查找不包含字符的字符串

xml - 如何计算一个单词在xml文件中出现了多少次