我有一个字段,其中包含以
构成的名称abc |姓,名| xyz
鉴于在管道符号之间始终始终是姓氏逗号,我该如何提取名字?
df['colname'].str.extract(pat = '(^|\s.+,\s.+|$)')
使用这种方法返回空白或空值。
答案 0 :(得分:0)
答案 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次以上,而不是逗号,竖线或换行符)
关闭群组\|
匹配管道模式或.+
中的[^\r\n,|]
部分也将匹配一个空字符串作为名称。
例如,您可能首先匹配一个字符a-zA-Z或指定要允许的名称,以防止空的名字或姓氏。
^[^\r\n|]*\|\s+([A-Za-z][^\r\n,|]*,\s*[A-Za-z][^\r\n,|]*)\|