正则表达式将字符串分成几部分

时间:2021-05-05 09:31:43

标签: regex regex-group

我有一个具有以下值的字符串,

ID Number / 1234
Name: John Doe Smith
Nationality: US

字符串总是带有 Name: 前置。

我用来获取全名的正则表达式是 (?<=Name:\s)(.*) 可以很好地获取全名。这个 (?<=Name:\s)([a-zA-Z]+) 似乎得到了名字。

因此,对于名字、中间名和姓氏,每个表达式都是理想的。有人可以指导我朝着正确的方向前进吗?

谢谢

2 个答案:

答案 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 个以上的单词字符

.NET regex demo

相关问题