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
我需要一个模式来提取在“发送请求”和“发送消息”之间有“唐纳德”的请求。在上面的示例中,两个请求包含“Donald”。所以reout list应该有2个项目。< / p>
答案 0 :(得分:2)
您正在寻找re.DOTALL
。
re.MULTILINE
来改变^
和$
行首和行尾锚点的行为,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()
注意问号;它指示乘数匹配满足模式的最小个字符数,而不是最多。
使用>>> 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
我们会在您更新的示例中找到3个匹配而不是1个匹配:
{{1}}