Python从段落中提取信息

2024-10-01 09:22:17 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

Name Rakesh Rao Age 34 Gender Male Marital Status Single

整个文本没有任何comas分开,所以我有一个困难的时间来分离这些信息。 有时变量名后面可能有冒号,有时可能没有。例如,在第1行,它是"Name Rakesh Rao",但在第2行,它是"Name: Ramachandra Deshpande"。你知道吗

有大约1400条记录的信息,所以这将是非常伟大的,如果我不必手动分离的信息。 有人能帮忙吗?我会非常感激的!你知道吗


Tags: name信息agestatus员工gendermale统计数据
3条回答

您可以匹配可选字符,在您的情况下,它是:与下面的表达式[:]?。你知道吗

根据提供的信息,此正则表达式应提取所需的信息:

^Name[:]?\s([A-Z][-'a-zA-Z]+)\s([A-Z][-'a-zA-Z]+)$

你可以检查它here。 此正则表达式将匹配两个单词名。也包含-'的名称。 在Python中可能是这样的:

regex = r"^Name[:]?\s([A-Z][-'a-zA-Z]+)\s([A-Z][-'a-zA-Z]+)$"    
test_str = ("Name Rakesh Rao\n"
    "Name: Ramachandra Deshpande")    
matches = re.finditer(regex, test_str, re.MULTILINE)

您还可以通过上面提供的链接检查这个示例。你知道吗

希望这有帮助。你知道吗

好吧,我想你可以试着用正则表达式来做。 如果你的文字是这样的:

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,非常明显。你知道吗

(?:\:)?

这部分创建了一个内部带有冒号的非捕获组((?:…))——它是\:,而不仅仅是:,因为冒号本身是regex语法的一部分。非捕获组,因为这个结肠对我们来说真的不重要。你知道吗

在一个空格后,我们得到:

(?P<name>\D+)

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

\D+表示“至少一个非数字字符”。这将捕获所有字母、下划线和空格。这就是为什么字段的顺序对这个特定表达式如此重要。如果要更改顺序并将Gender字段放在NameAge之间,它也会捕获它,因为+修饰符是贪婪的。你知道吗

另一方面,下一行中的\d+表示“至少一个数字字符”,因此介于0和9之间。你知道吗

我希望这个解释足够了,但在这个非常有用的网站上,在这里使用这个表达可能会对您有所帮助:

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

我已经为你输入了正则表达式和测试字符串。你知道吗

如果字段名始终在字符串中,则可以拆分这些字段名上的字符串。例如:

str_to_split = "Name Rakesh Rao Age 34 Gender Male Marital Status Single"
splitted = str_to_split.split("Age")
name = splitted[0].replace("Name", "")

如果文本仍然包含其他字符,可以使用replace(":", "")删除它们。否则,您可以使用NLTK工具箱从文本中删除所有类型的特殊字符。小心,因为名字里也可能有特殊的字符。你知道吗

相关问题 更多 >