代码之家  ›  专栏  ›  技术社区  ›  NotSimon

Python正则表达式是否跳过前几个字符?

  •  1
  • NotSimon  · 技术社区  · 15 年前

    嘿,我有一个关于正则表达式的基本问题。我只想返回body标记内(包括)的文本,我知道下面的错误,因为它还将匹配开始body标记之前的所有字符。我想知道你会怎么跳过那些?

    x = re.match('(.*<body).*?(</body>)', fileString)
    

    谢谢

    6 回复  |  直到 15 年前
        1
  •  2
  •   unutbu    15 年前

    下面是一些示例代码,它使用正则表达式查找 <body>...</body> 标签。尽管这演示了python re模块的一些特性,但请注意 Beautiful Soup 模块非常易于使用,如果您计划解析HTML或XML,它是一个更好的工具(请参阅下面的示例,了解如何使用BeautifulSoup解析此内容。)

    #!/usr/bin/env python
    import re
    
    # Here we have a string with a multiline <body>...</body>
    fileString='''baz<body>foo
    baby foo
    baby foo
    baby foo
    </body><body>bar</body>'''
    
    # re.DOTALL tells re that '.' should match any character, including newlines.
    x = re.search('(<body>.*?</body>)', fileString, re.DOTALL)
    for match in x.groups():
        print(match)
    # <body>foo
    # baby foo
    # baby foo
    # baby foo
    # </body>
    

    print(re.findall('(<body>.*?</body>)', fileString, re.DOTALL))
    # ['<body>foo\nbaby foo\nbaby foo\nbaby foo\n</body>', '<body>bar</body>']
    

    pat=re.compile('(<body>.*?</body>)', re.DOTALL)
    print(pat.findall(fileString))
    # ['<body>foo\nbaby foo\nbaby foo\nbaby foo\n</body>', '<body>bar</body>']
    

    以下是您如何使用BeautifulSoup:

    #!/usr/bin/env python
    from BeautifulSoup import BeautifulSoup
    
    fileString='''baz<body>foo
    baby foo
    baby foo
    baby foo
    </body><body>bar</body>'''
    soup = BeautifulSoup(fileString)
    print(soup.body)
    # <body>foo
    # baby foo
    # baby foo
    # baby foo
    # </body>
    
    print(soup.findAll('body'))
    # [<body>foo
    # baby foo
    # baby foo
    # baby foo
    # </body>, <body>bar</body>]
    
        2
  •  9
  •   Peter Boughton    15 年前

    我不懂Python,但这里有一个使用 Beautiful Soup

    import BeautifulSoup
    
    soup = BeautifulSoup(fileString)
    
    bodyTag = soup.html.body.string
    

    这将(理论上)处理HTML的所有复杂性,这对于纯基于regex的答案来说非常困难,因为它不是regex设计的目的。

        3
  •  0
  •   Mike Graham    15 年前

    不能用正则表达式解析HTML。HTML不是一种常规语言。改用像lxml这样的HTML解析器。

        4
  •  -2
  •   Ewan Todd    15 年前
     x = re.match('.*(<body>.*?</body>)', fileString)
    

    考虑MIDIOM进行HTML解析。

        5
  •  -2
  •   foosion    15 年前
    x = re.search('(<body>.*</body>)', fileString)
    x.group(1)
    

        6
  •  -2
  •   RedGlyph sumit sonawane    15 年前

    您的文件字符串是否包含 多行

    x = re.match(r"(?:.|\n)*(<body>(?:.|\n)*</body>)", fileString)
    

    或者,更简单地使用re模块:

    x = re.match(r".*(<body>.*</body>)", fileString, re.DOTALL)
    

    x.groups()[0] 如果x不是None,则应包含字符串。