2017-09-25 69 views
0

我有這樣data = ['This is the sentence "Hello" by writer "MK"', '2 Worlds [Harry]']雙引號內的匹配和提取子用正則表達式

字符串列表,我想只提取"Hello,這裏就是我所做的:

import re 
s = re.match('This is the sentence (.*) by writer', data[0]) 
s 

但是,相反的"Hello ,我得到這個<_sre.SRE_Match object; span=(0, 38), match='This is the sentence "Hello" by writer'>

有人能告訴我如何將其正確寫入?

+0

你想實現這樣的事情? https://eval.in/867424 –

+2

當您打印's',它打印的正則表達式匹配對象 - 多以同樣的方式,如果你編寫一個函數,然後在不調用它打印函數的名字,你會得到該對象的字符串表示,*不*該函數將返回的內容。 (。*)如果你想訪問你'標誌着組',你必須訪問顯式:'打印(s.group(1))' – n1c9

+0

您標記的解決方案是次優的正則表達式的條款。如果你想改善你的正則表達式,請參閱:https://stackoverflow.com/a/46398384/4909087 –

回答

0

當您打印S,它打印的正則表達式匹配對象 - 多以同樣的方式,如果你編寫一個函數,然後在不調用它打印函數的名字,你會得到該函數的字符串表示的,而不是該函數將返回:

def hello(): 
    return 'hello!' 

print(hello) 
>>> <function hello at 0x7f570e3aa9b0> 

如果你想訪問你所指的小組,你必須獲得明確(。*):另外

s = re.match('This is the sentence (.*) by writer', data[0]) 
print(s.group(1)) 
>>>"Hello 

,您可以檢查是否有一個匹配組按以下方式,避免了一個AttributeError,如果再是不匹配:

s = re.match('This is the sentence (.*) by writer', data[0]) 
if s: 
    print(s.group(1)) 
+0

隨着每一次編輯,這個答案越來越接近我的...會欣賞一些歸屬或只是不加它,謝謝。 –

+0

你想要歸因於什麼?我的評論與本答案基本相同,在答案前2分鐘發佈。 – n1c9

+0

提到AttributeError的部分。一個簡單的,「就像他們的答案中提到的冷飲,你可以檢查...」就足夠了。 –

0

假設你只是想無論是帶引號的字符串中,使用re.search與捕獲組,如果發現匹配提取的第一個組。

m = re.search('"(.*?)"', data[0]) 
if m: 
    print(m.group(1)) 
Hello

如果發現匹配,則返回match對象。您可以調用此對象的group(n)屬性來提取您的字符串。如果沒有匹配,則返回None。出於這個原因,有必要在打印之前查詢返回值,否則您會收到一個AttributeError

詳細

"  # double quote 
(  # open 1st capture group 
.*?  # non-greedy matcher 
)    
" 

注意,你不應該硬編碼的模式。更重要的是,除非你知道你在做什麼,否則不要使用貪婪捕獲.*

0

「re.match」返回「MatchObject」,你需要做的使用.group(1)來從比賽的數據。