[英]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.