2017-07-24 23 views
0

我有兩個行,看起來像如何用一個正則表達式解析多行?

Content-Type: text/plain 
Content-Type: text/plain; charset=UTF-8 

要解析,我用這樣的命令("^Content-Type:\s(.*)")捕捉(text/plain)部分。另一方面,我使用正則表達式("^Content-Type:\s(.*)[;]")捕獲相同的字符串(text/plain)。有什麼方法可以使用在兩種情況下都能正常工作的方法嗎?我正在使用python,而我是新來的正則表達式。感謝

+0

標籤應該告知用戶您的語言。這次我爲你編輯。 –

+0

'^ Content-Type:\ s +(。*?)(?=>; | $)'雖然你根本不需要regex來處理這種簡單的情況。 – zwer

回答

2

您可以直接修改您的正則表達式位:

Content-Type:\s([^;\s]*) 

這裏是一個工作環節:Regex101

+0

OP正在嘗試捕獲內容類型字符串,而不是整個標題行:「text/plain」,而不是「Content-Type:text/plain」。 –

+0

謝謝。這是我需要的 –

0

看起來你正在尋找的?量詞(在list in the docs 6下)。它將使尾部在所有出現一次或不佔地兩種情況:

 
^Content-Type:\s+([^;]+)(?:;.*)? 

這裏有變化,我會建議:

  • 不要在您的捕獲組捕獲.*是貪婪的,所以你有時會得到不受歡迎的字符:例如如果字符串中有兩個分號,則第一個將被捕獲。相反,捕獲[^;],這意味着「除分號外的任何內容」。
  • 將主catpure組中的量詞從*更改爲+。你至少想要匹配一個字符,這就是+表示的內容。
  • 爲了安全起見,我還要將+量詞添加到前面的\s中。它會讓你匹配多個空間,如果有的話。
  • 使該;到非捕獲組(從(?:一組相匹配的一部分。這可以讓你的?量詞適用於它。

由於@RudyTheHunter間接地指出,如果你使用平原re.match,你不需要領導^或者,因爲在所有match看在字符串的開頭分號後的尾部部分。

可以因此只使用

Content-Type:\s+([^;]+) 
0

正如我在評論已經指出,正則表達式是這樣一個簡單的比賽矯枉過正,所以爲了完整起見:

def parse_content_type(data): 
    if data.lower()[:13] == "content-type:": # HTTP headers are case-insensitive by spec. 
     index = data.find(";") # find the position of `;` 
     return data[13:index if index > -1 else len(data)].strip() # slice and strip 

print(parse_content_type("Content-Type: text/plain")) # text/plain 
print(parse_content_type("Content-Type: text/plain; charset=UTF-8")) # text/plain 

它更冗長,但在理論上,它應該會更快。