如何从字符串中提取名称

时间:2019-10-11 22:22:30

标签: regex

我有一个字段,其中包含以

构成的名称
  

abc |姓,名| xyz

鉴于在管道符号之间始终始终是姓氏逗号,我该如何提取名字?

df['colname'].str.extract(pat = '(^|\s.+,\s.+|$)')

使用这种方法返回空白或空值。

3 个答案:

答案 0 :(得分:0)

您可以使用此正则表达式:

([a-zA-Z]+)\s*,\s*([a-zA-Z]+)

演示: Here

答案 1 :(得分:0)

假设管道符号实际上在字符串中,并假设您的字符已经是字符串(或可以通过将引号内的字符括起来而变成字符串),然后将stringr包与str_extract()一起使用功能可以解决问题。如果姓氏或名字都大写,则需要更改此代码。

基本上,只专注于首先匹配最简单的字符,即逗号。然后,一旦有了匹配项,就逐步建立模式,并在第一次匹配后越来越多地匹配,直到满足您的要求为止。

library(stringr)

names <- "abc | lastname, firstname | xyz"    # create a string
print(names)     

str_extract(names, "[a-z]*, [a-z]*")          # extract the names


[1] "abc | lastname, firstname | xyz"      # printed string

'lastname, firstname'                      # output

答案 2 :(得分:0)

您可以利用捕获组和否定的字符类[^...]来匹配除列出的字符以外的任何字符。

该值在第一个捕获组中。

请注意将管道转出字符类之外。

^[^\r\n|]*\|\s+([^\r\n,|]+,[^\r\n,|]+)\|

部分

  • ^字符串的开头
  • [^\r\n|]*匹配0+次而不是管道或换行符
  • \|\s+匹配管道和1个以上的空格字符
  • (捕获第1组
    • [^\r\n,|]+匹配1次以上,而不是逗号,竖线或换行符
    • ,匹配逗号
    • [^\r\n,|]+匹配1次以上,而不是逗号,竖线或换行符
  • )关闭群组
  • \|匹配管道

Regex demo

模式或.+中的[^\r\n,|]部分也将匹配一个空字符串作为名称。

例如,您可能首先匹配一个字符a-zA-Z或指定要允许的名称,以防止空的名字或姓氏。

^[^\r\n|]*\|\s+([A-Za-z][^\r\n,|]*,\s*[A-Za-z][^\r\n,|]*)\|

Regex demo