我有一个具有以下值的字符串,
ID Number / 1234
Name: John Doe Smith
Nationality: US
字符串总是带有 Name: 前置。
我用来获取全名的正则表达式是 (?<=Name:\s)(.*)
可以很好地获取全名。这个 (?<=Name:\s)([a-zA-Z]+)
似乎得到了名字。
因此,对于名字、中间名和姓氏,每个表达式都是理想的。有人可以指导我朝着正确的方向前进吗?
谢谢
答案 0 :(得分:2)
您可以将它们分为 3 个不同的组:
(?<=Name:\s)([a-zA-Z]+)\s+([a-zA-Z]+)\s+([a-zA-Z]+)
>>> re.search('(?<=Name:\s)([a-zA-Z]+)\s+([a-zA-Z]+)\s+([a-zA-Z]+)', 'Name: John Doe Smith').groups()
('John', 'Doe', 'Smith')
或者,获得全名后,您可以对结果应用 split
,并在列表中获取名称:
>>> re.split(r'\s+', 'John Doe Smith')
['John', 'Doe', 'Smith']
出于某种原因,我假设了 Python,但上述内容几乎可以应用于任何编程语言。
答案 1 :(得分:1)
正如您在使用 .NET 的评论中所述,您可以在后视中使用量词来选择要在 Name:
之后选择“单词”的哪一部分
例如,要获取名称的第三部分,您可以使用 {2}
作为量词。
要匹配非空白字符而不是仅匹配单词字符,可以使用 \S+
代替 \w+
(?<=\bName:(?:\s+\w+){2}\s+)\w+
(?<=
正向lookbehind,断言从当前位置直接向左是:
\bName:
防止部分匹配的单词边界,匹配 Name:
(?:\s+\w+){2}
整体重复 2 次,匹配 1+ 个空白字符和 1+ 个单词字符。 (要获取第二个名称,请使用 {1}
或省略量词,获取第一个名称使用 {0}
)\s+
匹配 1 个以上的空白字符)
近距离回顾\w+
匹配 1 个以上的单词字符