<p>好吧,我想你可以试着用正则表达式来做。
如果你的文字是这样的:</p>
<pre><code>paragraph = 'Name Rakesh Rao Age 34 Gender Male Marital Status Single'
</code></pre>
<p>您可以使用这个正则表达式(必须首先<code>import re</code>):</p>
<pre><code>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
)
</code></pre>
<p>然后可以使用正则表达式中定义的组的名称,如下所示:</p>
<pre><code>>>> m.group('name')
'Rakesh Rao'
>>> m.group('age')
'34'
>>> m.group('gender')
'Male'
>>> m.group('status')
'Single'
</code></pre>
<p>如果所有字段都在一行中,则只需在正则表达式中用单个空格替换<code>\n</code>。你知道吗</p>
<p>请注意,这将支持在行名后面紧跟一个逗号,如下所示:</p>
<pre><code>Name: Rakesh Rao
</code></pre>
<p>但它不支持不同的数据顺序。如果你也愿意的话,我可以试着写一个不同的表达式。你知道吗</p>
<h3>表达式的解释</h3>
<p>让我们看一下表达式的第一行:</p>
<pre><code>r'Name(?:\:)? (?P<name>\D+) '
</code></pre>
<p>首先,为什么使用<code>r'…'</code>字符串语法?这只是为了避免双反斜杠。在“典型”字符串中,我们需要这样写表达式:</p>
<pre><code>'Name(?:\\:)? (?P<name>\\D+) '
</code></pre>
<p>现在,到实际的表达。第一部分,<code>Name</code>,非常明显。你知道吗</p>
<pre><code>(?:\:)?
</code></pre>
<p>这部分创建了一个内部带有冒号的非捕获组(<code>(?:…)</code>)——它是<code>\:</code>,而不仅仅是<code>:</code>,因为冒号本身是regex语法的一部分。非捕获组,因为这个结肠对我们来说真的不重要。你知道吗</p>
<p>在一个空格后,我们得到:</p>
<pre><code>(?P<name>\D+)
</code></pre>
<p>这将创建一个命名组,语法为<code>(?P<name_of_the_group>…)</code>。我使用命名组只是为了以后更容易更好地提取信息,使用<code>m.group('name')</code>,其中<code>m</code>是匹配对象。你知道吗</p>
<p><code>\D+</code>表示“至少一个非数字字符”。这将捕获所有字母、下划线和空格。这就是为什么字段的顺序对这个特定表达式如此重要。如果要更改顺序并将<code>Gender</code>字段放在<code>Name</code>和<code>Age</code>之间,它也会捕获它,因为<code>+</code>修饰符是贪婪的。你知道吗</p>
<p>另一方面,下一行中的<code>\d+</code>表示“至少一个数字字符”,因此介于0和9之间。你知道吗</p>
<p>我希望这个解释足够了,但在这个非常有用的网站上,在这里使用这个表达可能会对您有所帮助:</p>
<p><a href="https://regex101.com/r/N5ZJU9/2" rel="nofollow noreferrer">https://regex101.com/r/N5ZJU9/2</a></p>
<p>我已经为你输入了正则表达式和测试字符串。你知道吗</p>