好吧,我想你可以尝试使用正则表达式来做到这一点。
如果您的文字正是这样:
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
我已经为你输入了正则表达式和测试字符串。