使用python进行多行模式搜索

时间:2013-04-09 14:26:49

标签: python regex

 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>

1 个答案:

答案 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}}