使用python进行多行模式搜索
我需要一个模式来提取在“发送请求”和“要发送的消息是”之间有“Donald”的请求。在上面的示例中,两个请求包含“Donald”。因此,reout列表应该有两个项目。您正在寻找的是使用python进行多行模式搜索,python,regex,Python,Regex,我需要一个模式来提取在“发送请求”和“要发送的消息是”之间有“Donald”的请求。在上面的示例中,两个请求包含“Donald”。因此,reout列表应该有两个项目。您正在寻找的是 re.MULTILINE需要改变^和$行首和行尾定位点的行为,re.DOTALL也使匹配新行 re.M re.MULTILINE 指定时,模式字符'^'在以下位置匹配: 字符串的开头和每行的开头 (紧跟在每条新线之后);以及模式字符“$” 在字符串末尾和每行末尾匹配 (紧跟在每条换行之前)。默认情况下,“^”仅在以下
re.MULTILINE
需要改变^
和$
行首和行尾定位点的行为,re.DOTALL
也使
匹配新行
re.M
re.MULTILINE
指定时,模式字符
'^'
在以下位置匹配:
字符串的开头和每行的开头
(紧跟在每条新线之后);以及模式字符“$”
在字符串末尾和每行末尾匹配
(紧跟在每条换行之前)。默认情况下,“^”
仅在以下位置匹配:
字符串的开头,并且仅在字符串和
紧靠字符串末尾的换行符(如果有)之前
re.S
re.DOTALL
使
“.
特殊字符完全匹配任何字符,包括换行符;如果没有此标志,。
将匹配除换行符以外的任何内容
通过re.DOTALL
,我得到:
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
注意问号;它指示乘法器匹配满足模式的最小字符数,而不是最大字符数
使用.findall()
我们在更新的示例中找到3个匹配项,而不是1个:
exepat = re.compile(r"Sending request.*?TO BE SENT IS", re.DOTALL)
非常感谢您的快速响应。我的问题比我之前解释的更复杂。我正在查找“发送请求”和“待发送is”之间的块。在上面的字符串中,它出现了3次。因此我的reout应该列出3项。我尝试了“re.findall”和“re.finditer”方法。输出与预期不符。请在这方面帮助我
exepat = re.compile(r"Sending request.*?TO BE SENT IS", re.DOTALL)
>>> 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