python regex查找字段名称

2024-05-16 13:48:42 发布

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

我试图爬网一个网站和解析板球记分板使用刮擦。除了接球的那场,我大部分时间都能做到。有几种方法可以找到文本,例如

  1. c苏美亚萨卡b鲁贝尔侯赛因
  2. Imrul Kayes b MOSADEK Hossain公司
  3. c&b索迪酒店
  4. c安德森b博尔特
  5. c†伦顿b康明斯

这样做的目的是得到接球的外野手的名字,这意味着

  • 苏米亚萨卡尔
  • 伊姆鲁尔·凯斯
  • 索迪
  • 安德森

到目前为止,我已经想出了以下正则表达式

(c\s)([A-Za-z]*)
(c & b)(\s[a-zA-Z]*)

当我在捕手中只有姓氏的时候,比如安德森,索迪,它们就起作用了,但是它们和全名不起作用。我需要在单个组中捕获完整的名称,以便在后期使用。你知道吗

我知道这些可能不是完美的,所以任何对现有的建议也欢迎

编辑 增加了一个特殊的情况下,名称前面是匕首符号。你知道吗


Tags: 方法文本目的名称网站时间公司酒店
2条回答

你要找的正则表达式:

c(?: & b)? (.+?)(?: b |$)

首先有两个案例:

cc & b

然后要匹配尽可能多的字符,直到找到b或行尾

下面是我使用python2.7得到的:

import re

pattern = re.compile('c(?: & b)? (.+?)(?: b |$)')

NAMES = ('c Soumya Sarkar b Rubel Hossain',
         'c Imrul Kayes b Mosaddek Hossain',
         'c & b Sodhi',
         'c Anderson b Boult',
         'c †Lenton b Cummins ')

for name in NAMES:
    w = pattern.match(name)
    print w.group(1)

输出:

Soumya Sarkar
Imrul Kayes
Sodhi
Anderson
†Lenton

你可以选择:

(?|                     # a so called "branch reset", only supported by the regex module
    c\                  # a "c "
    (?P<catcher>.{2,}?) # at least two characters, lazily -> group "catcher"
    \ b\                # followed by " b "
|                       # or
    c\ & \ b\           # "c & b "
    (?P<catcher>.+)     # capture the rest of the string -> group "catcher"
)


Python代码中:
# the newer regex module
import regex as re

rx = re.compile(r'''
  (?|
  c\ 
  (?P<catcher>.{2,}?)
  \ b\ 
  |
  c\ & \ b\ 
  (?P<catcher>.+))
''', re.VERBOSE)

sampletext = """
c Soumya Sarkar b Rubel Hossain
c Imrul Kayes b Mosaddek Hossain
c & b Sodhi
c Anderson b Boult
"""

catchers = [m.group('catcher') for m in rx.finditer(sampletext)]
print(catchers)
# ['Soumya Sarkar', 'Imrul Kayes', 'Sodhi', 'Anderson']

看看working on regex101.com
您需要有较新的regex模块(pip install regex)才能使此工作正常。你知道吗

相关问题 更多 >