2017-01-08 31 views
1

我想抓取一個網站,並使用scrapy解析板球記分牌。除了接球的領域之外,我一直能夠做到這一點。可以有多種方式,其中的文本可以發現諸如蟒蛇正則表達式尋找守場員的名字

  1. Ç索姆亞·薩卡爾b魯貝爾·侯賽因
  2. Ç魯爾·凱斯b莫薩迪克·霍塞恩
  3. Ç& b Sodhi
  4. c Anderson b Boult
  5. c†Lenton b康明斯

的想法是讓誰已採取這意味着

  • 索姆亞·薩卡爾漁獲
  • 魯爾·凱斯
  • Sodhi
  • 安德森

外野手名我已經拿出了以下的正則表達式到目前爲止

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

這些工作,當我剛剛在捕手,如安德森,sodhi姓氏,但他們不工作的全名。我需要在一個單獨的組中捕獲完整的名稱,我可以在後面的階段使用它。

我知道這可能不是完美的,所以在現有的任何建議,也歡迎

編輯 添加將名稱由匕首符號開頭的特殊情況。

回答

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 
+0

但它確實返回了「b」之後的投球手名稱。它也不會在c&b情況下選擇任何東西。你也可以添加一些解釋 – Neel

+0

我試圖在regex101我會嘗試在我的代碼,然後更新 – Neel

+0

我在第一次編輯(關於您發佈您的評論的時間)更正了正則表達式:您可以重試regex101,它應該工作。 – Faibbus

2

你可以去:

(?|      # 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)才能完成此項工作。