pandas 使用正则表达式从文本中获取值

pandas get a value out of text using regex

我有这样的文字:

text = 'Ronald Mayr: A\nBell Kassulke: B\nJacqueline Rupp: A \nAlexander Zeller: C\nValentina Denk: C \nSimon Loidl: A \nElias Jovanovic: B \nStefanie Weninger: B \nFabian Peer: C \nHakim Botros: B\nEmilie Lorentsen: B\n'

我需要获取所有具有“:B”值的名称.. 例如 Bell Kassulke、Elias Jovanovic

我正在尝试这样的事情

stu = re.findall('\w+.*.: B',text)

但是这个给了我这样的列表:

['Bell Kassulke: B',
 'Simon Loidl: B',
 'Elias Jovanovic: B']

虽然我只需要名字而不是整个列表。我具体能做什么?

您可以使用

^(.*?):\s*B\s*$

regex demo

详情

  • ^ - 字符串的开头
  • (.*?) - 第 1 组(.findall 的实际值):除换行字符外的任何零个或多个字符尽可能少
  • : - 冒号
  • \s*B\s* - 包含零个或多个空格的 B
  • $ - 字符串结尾/

在Pandas中,您可以使用

df['Col name here'].str.findall(r'^(.*?):\s*B\s*$').str.join(',')

或者,如果每个值需要一个匹配项:

df['Results'] = df['Col name here'].str.extract(r'^(.*?):\s*B\s*$', expand=False)

您可以在正则表达式后添加这行代码:

stu = [s.replace(': B', '') for s in stu]

试试这个

'('开始捕捉

\w+

匹配任何单词字符(等于[a-zA-Z0-9_])

量词——在一次和无限次之间匹配,尽可能多次,根据需要回馈(贪婪)

.*

匹配任何字符(行终止符除外)

量词——在零次和无限次之间匹配,尽可能多次,按需回馈(贪心)

')' 捕获结束

: B

字面上匹配字符:B(区分大小写)

pattern='(\w+.*.): B'
re.findall(pattern,grades)