从给定窗体提取所需名称

2024-05-23 18:58:38 发布

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

我有一个包含如下所示数据的文本文件。我得从中提取一些必要的名字。我正在尝试下面的代码,但没有得到所需的结果。你知道吗

该文件包含以下数据:

Leader :     Tim Lee ; 34567
Head\Organiser: Sam Mathews; 11:53 am
Head: Alica Mills; 45612
Head\Secretary: Maya Hill; #53190
Captain- Jocey David # 45123
Vice Captain:- Jacob Green;  -65432

我正在尝试的代码:

import re
pattern = re.compile(r'(Leader|Head\\Organiser|Captain|Vice Captain).*(\w+)',re.I)
matches=pattern.findall(line)
for match in matches:
    print(match)

预期产量:

Tim Lee
Sam Mathews
Jocey David
Jacob Green

Tags: 数据代码resamviceheaddavidleader
2条回答
import re
line = '''
Leader :     Tim Lee ; 34567
Head\Organiser: Sam Mathews; 11:53 am
Head: Alica Mills; 45612
Head\Secretary: Maya Hill; #53190
Captain- Jocey David # 45123
Vice Captain:- Jacob Green;  -65432'''
pattern = re.compile(r'(?:Leader|Head(?:\\Organiser|\\Secretary)?|Captain|Vice Captain)\W+(\w+(?:\s+\w+)?)',re.I)
matches=pattern.findall(line)
for match in matches:
    print(match)

说明:

(?:                 : start non capture group
  Leader            : literally
 |                  : OR
  Head              : literally
  (?:               : start non capture group
    \\Organiser     : literally
   |                : OR
    \\Secretary     : literally
  )?                ! end group, optional
 |                  : OR
  Captain           : literally
 |                  : OR
  Vice Captain      : literally
)                   : end group
\W+                 : 1 or more non word character
(                   : start group 1
  \w+               : 1 or more word char
  (?:               : non capture group
    \s+             : 1 or more spaces
    \w+             : 1 or more word char
  )?                : end group, optional
)                   : end group 1

给定示例的结果:

Tim Lee
Sam Mathews
Alica Mills
Maya Hill
Jocey David
Jacob Green

给出:

s='''\
Leader :     Tim Lee ; 34567
Head\Organiser: Sam Mathews; 11:53 am
Head: Alica Mills; 45612
Head\Secretary: Maya Hill; #53190
Captain- Jocey David # 45123
Vice Captain:- Jacob Green;  -65432'''

你可以得到这样的名字:

>>> [e.rstrip() for e in re.findall(r'[:-]+[ \t]+(.*?)[;#]',s)]
['Tim Lee', 'Sam Mathews', 'Alica Mills', 'Maya Hill', 'Jocey David', 'Jacob Green']

或者,创建标题和相关名称的dict:

>>> {k:v.rstrip() for k,v in re.findall(r'^\s*(Leader|Head\\Organiser|Head|Head\\Secretary|Captain|Vice Captain)\s*[:-]+[ \t]+(.*?)[;#]',s, re.M)}
{'Leader': 'Tim Lee', 'Head\\Organiser': 'Sam Mathews', 'Head': 'Alica Mills', 'Head\\Secretary': 'Maya Hill', 'Captain': 'Jocey David', 'Vice Captain': 'Jacob Green'}

然后可以限制为所需的标题:

>>> {k:v.rstrip() for k,v in re.findall(r'^\s*(Leader|Head\\Organiser|Captain|Vice Captain)\s*[:-]+[ \t]+(.*?)[;#]',s, re.M)}
{'Leader': 'Tim Lee', 'Head\\Organiser': 'Sam Mathews', 'Captain': 'Jocey David', 'Vice Captain': 'Jacob Green'}

如果您只需要名称(Python3.6+保持顺序,因此它们将按字符串顺序排列):

>>> {k:v.rstrip() for k,v in re.findall(r'^\s*(Leader|Head\\Organiser|Captain|Vice Captain)\s*[:-]+[ \t]+(.*?)[;#]',s, re.M)}.values()
dict_values(['Tim Lee', 'Sam Mathews', 'Jocey David', 'Jacob Green'])

Demo and explanation of regex

相关问题 更多 >