匹配字符串时捕获前面的n个单词

2024-10-17 06:15:46 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有这段文字:

abcdefg Mark Jones (PP) etc etc
akslaskAS Taylor Daniel Lautner (PMB) blabla
etcetc Allan Stewart Konigsberg Farrow (PRTW)

我想捕捉这些个人姓名:

Mark Jones, Taylor Daniel Lautner, Allan Stewart Konigsberg Farrow.

基本上,当我们发现(p后跟任何大写字母时,我们捕获前面以大写字母开头的n个单词

到目前为止,我所取得的成就是用这段代码只捕获了前面的一个单词:\w+(?=\s+(\(P+[A-Z])),但我无法从中发展。 如果有人能帮忙,我将不胜感激:)


Tags: etc大写字母单词ppmark文字danieljones
2条回答

正则表达式模式

\b((?:[A-Z]\w+\s?)+)\s\(P[A-Z]

为了找到上述正则表达式模式的所有匹配项,我们可以使用^{}

import re

text = """abcdefg Mark Jones (PP) etc etc
akslaskAS Taylor Daniel Lautner (PMB) blabla
etcetc Allan Stewart Konigsberg Farrow (PRTW)
"""

matches = re.findall(r'\b((?:[A-Z]\w+\s?)+)\s\(P[A-Z]', text)

>>> matches
['Mark Jones', 'Taylor Daniel Lautner', 'Allan Stewart Konigsberg Farrow']

正则表达式详细信息

  • \b:防止部分匹配的单词边界
  • ((?:[A-Z]\w+\s?)+):第一个捕获组
    • (?:[A-Z]\w+\s?)+:非捕获组匹配一次或多次
      • [A-Z]:匹配大写字母{}到{}之间的单个字母表
      • \w+:匹配任意单词字符一次或多次
      • \s?:将任何空白字符匹配零次或一次
  • \s:匹配单个空白字符
  • \(:按字面意思匹配字符(
  • P:按字面意思匹配字符P
  • [A-Z]:匹配大写字母{}到{}之间的单个字母表

见在线^{}

有了你们展示的样品,你们能试一下下面的吗。在这里使用Python的re库获取结果。首先,使用findall从给定的字符串var中获取所有值,其中(.*?)\s+\((?=P[A-Z])将捕获后面有P和大写字母的所有内容,然后创建一个列表lst。后来,使用替换函数将所有非间隔的内容替换为空,然后将第一次出现的空格替换为空,以获得准确的值

import re
var="""abcdefg Mark Jones (PP) etc etc
akslaskAS Taylor Daniel Lautner (PMB) blabla
etcetc Allan Stewart Konigsberg Farrow (PRTW)"""

lst = re.findall(r'(.*?)\s+\((?=P[A-Z])',var)
[re.sub(r'^\S+\s+','',s) for s in lst]

输出如下:

['Mark Jones', 'Taylor Daniel Lautner', 'Allan Stewart Konigsberg Farrow']

相关问题 更多 >