簡體   English   中英

使用python進行多行模式搜索

[英]Multiline Pattern search using python

 s="""04-09 11:11:57.879 D/PTT [STACK]( 1653): *********Sending request
    04-09 11:11:57.879 [STACK]( 1653): *********
    04-09 11:11:57.879 [STACK]( 1653): S: abcd 
    04-09 11:11:57.879 [STACK]( 1653): l: jockey
    04-09 11:11:57.879 [STACK]( 1653): k: sucess
    04-09 11:11:57.879 [STACK]( 1653): j: 82
    04-09 11:11:57.879 [STACK]( 1653): 
    04-09 11:11:57.879 [STACK]( 1653): MESSAGE TO BE SENT IS
    04-09 11:11:57.879 [STACK]( 1653): Not doing anything
    04-09 11:11:57.879 [STACK]( 1653): Not doing anything
    04-09 11:11:57.879 [STACK]( 1653): Not doing anything
    04-09 11:11:57.879 D/PTT [STACK]( 1653): *********Sending request
    04-09 11:11:57.879 [STACK]( 1653): *********
    04-09 11:11:57.879 [STACK]( 1653): S: abcd 
    04-09 11:11:57.879 [STACK]( 1653): l: Donald
    04-09 11:11:57.879 [STACK]( 1653): k: sucess
    04-09 11:11:57.879 [STACK]( 1653): j: 83
    04-09 11:11:57.879 [STACK]( 1653): 
    04-09 11:11:57.879 [STACK]( 1653): MESSAGE TO BE SENT IS
    04-09 11:11:57.879 [STACK]( 1653): Not doing anything
    04-09 11:11:57.879 [STACK]( 1653): Not doing anything
    04-09 11:11:57.879 [STACK]( 1653): Not doing anything
    04-09 11:11:57.879 D/PTT [STACK]( 1653): *********Sending request
    04-09 11:11:57.879 [STACK]( 1653): *********
    04-09 11:11:57.879 [STACK]( 1653): S: abcd 
    04-09 11:11:57.879 [STACK]( 1653): l: Mickey
    04-09 11:11:57.879 [STACK]( 1653): k: sucess
    04-09 11:11:57.879 [STACK]( 1653): j: 84
    04-09 11:11:57.879 [STACK]( 1653): 
    04-09 11:11:57.879 [STACK]( 1653): 
    04-09 11:11:57.879 [STACK]( 1653): MESSAGE TO BE SENT IS
    04-09 11:11:57.879 D/PTT [STACK]( 1653): *********Sending request
    04-09 11:11:57.879 [STACK]( 1653): *********
    04-09 11:11:57.879 [STACK]( 1653): S: abcd 
    04-09 11:11:57.879 [STACK]( 1653): l: Donald
    04-09 11:11:57.879 [STACK]( 1653): k: sucess
    04-09 11:11:57.879 [STACK]( 1653): j: 83
    04-09 11:11:57.879 [STACK]( 1653): 
    04-09 11:11:57.879 [STACK]( 1653): MESSAGE TO BE SENT IS
    04-09 11:11:57.879 D/PTT [STACK]( 1653): *********Sending request
    04-09 11:11:57.879 [STACK]( 1653): *********
    04-09 11:11:57.879 [STACK]( 1653): S: abcd 
    04-09 11:11:57.879 [STACK]( 1653): l: jockey
    04-09 11:11:57.879 [STACK]( 1653): k: sucess
    04-09 11:11:57.879 [STACK]( 1653): j: 82
    04-09 11:11:57.879 [STACK]( 1653): 
    04-09 11:11:57.879 [STACK]( 1653): MESSAGE TO BE SENT IS"""

    exepat= re.compile(".*Sending request.*?Donald.*?TO BE SENT IS",re.DOTALL)

    reout = exepat.findall(s)

    print reout[0]

Expected Output:
    04-09 11:11:57.879 D/PTT [STACK]( 1653): *********Sending request
    04-09 11:11:57.879 [STACK]( 1653): *********
    04-09 11:11:57.879 [STACK]( 1653): S: abcd 
    04-09 11:11:57.879 [STACK]( 1653): l: Donald
    04-09 11:11:57.879 [STACK]( 1653): k: sucess
    04-09 11:11:57.879 [STACK]( 1653): j: 83
    04-09 11:11:57.879 [STACK]( 1653): 
    04-09 11:11:57.879 [STACK]( 1653): MESSAGE TO BE SENT IS

我需要一個模式來提取在“發送請求”和“發送消息”之間有“唐納德”的請求。在上面的示例中,兩個請求包含“唐納德”。因此,重新列表應該有2個項目。

你正在尋找re.DOTALL

re.MULTILINE需要re.MULTILINE來改變^$ start-of-line和end-of-line錨點的re.DOTALL . 也匹配換行符。

re.M
re.MULTILINE
指定時,模式字符'^'匹配字符串的開頭和每行的開頭(緊跟在每個換行符之后); 並且模式字符'$'在字符串的末尾和每行的末尾(緊接在每個換行符之前)匹配。 默認情況下, '^'僅匹配字符串的開頭, '$'僅匹配字符串的末尾,緊接在字符串末尾的換行符(如果有)之前。

re.S
re.DOTALL
制作'.' 特殊字符匹配任何字符,包括換行符; 沒有這個標志, '.' 將匹配除換行符之外的任何內容。

有了re.DOTALL ,我得到:

>>> exepat= re.compile(r"Sending request.*TO BE SENT IS", re.DOTALL)
>>> reout = exepat.search(s)
>>> print reout
<_sre.SRE_Match object at 0x10a729370>
>>> print reout.group()
Sending request
04-09 11:11:57.879 [STACK]( 1653): *********
04-09 11:11:57.879 [STACK]( 1653): S: abcd 
04-09 11:11:57.879 [STACK]( 1653): l: jockey
04-09 11:11:57.879 [STACK]( 1653): k: sucess
04-09 11:11:57.879 [STACK]( 1653): j: 82
04-09 11:11:57.879 [STACK]( 1653): 
04-09 11:11:57.879 [STACK]( 1653): 
04-09 11:11:57.879 [STACK]( 1653): MESSAGE TO BE SENT IS

如果你有多個這樣的消息,你需要使用非貪婪的*? 比賽:

exepat = re.compile(r"Sending request.*?TO BE SENT IS", re.DOTALL)

注意問號; 它指示乘數匹配滿足模式的最小字符數,而不是最多。

使用.findall()然后我們在更新的示例中找到3個匹配而不是1個匹配:

>>> exepat = re.compile(r"Sending request.*?TO BE SENT IS", re.DOTALL)
>>> exepat.findall(s)
['Sending request\n04-09 11:11:57.879 [STACK]( 1653): *********\n04-09 11:11:57.879 [STACK]( 1653): S: abcd \n04-09 11:11:57.879 [STACK]( 1653): l: jockey\n04-09 11:11:57.879 [STACK]( 1653): k: sucess\n04-09 11:11:57.879 [STACK]( 1653): j: 82\n04-09 11:11:57.879 [STACK]( 1653): \n04-09 11:11:57.879 [STACK]( 1653): \n04-09 11:11:57.879 [STACK]( 1653): MESSAGE TO BE SENT IS', 'Sending request\n04-09 11:11:57.879 [STACK]( 1653): *********\n04-09 11:11:57.879 [STACK]( 1653): S: abcd \n04-09 11:11:57.879 [STACK]( 1653): l: jockey\n04-09 11:11:57.879 [STACK]( 1653): k: sucess\n04-09 11:11:57.879 [STACK]( 1653): j: 83\n04-09 11:11:57.879 [STACK]( 1653): \n04-09 11:11:57.879 [STACK]( 1653): \n04-09 11:11:57.879 [STACK]( 1653): MESSAGE TO BE SENT IS', 'Sending request\n04-09 11:11:57.879 [STACK]( 1653): *********\n04-09 11:11:57.879 [STACK]( 1653): S: abcd \n04-09 11:11:57.879 [STACK]( 1653): l: jockey\n04-09 11:11:57.879 [STACK]( 1653): k: sucess\n04-09 11:11:57.879 [STACK]( 1653): j: 84\n04-09 11:11:57.879 [STACK]( 1653): \n04-09 11:11:57.879 [STACK]( 1653): \n04-09 11:11:57.879 [STACK]( 1653): MESSAGE TO BE SENT IS']
>>> len(exepat.findall(s))
3

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM