Regex include line breaks
本问题已经有最佳答案,请猛点这里访问。
我有以下XML文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <p style="1"> A </p> <p style="3"> B C <p style="5"> D </p> <p style="1"> Picture number 3? </p> |
我只想知道
1 2 3 4 5 6 7 8 9 | import os, re html = open("2.xml","r") text = html.read() lon = re.compile(r' (.+) ', re.MULTILINE) lon = lon.search(text).group(1) print lon |
但它似乎不起作用。
1)不要用regex解析XML。只是不起作用。使用XML分析器。
2)如果使用regex,则不需要
3)您可能还希望模式返回尽可能短的匹配,使用非贪婪
1 2 3 | lon = re.compile(r' (.+?) ', re.DOTALL) |
您可以尝试在DIV上进行拆分,然后在列表项上进行匹配。这对大型数据上的regex也很有效。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | import re html ="""<p style="1"> A </p> <p style="3"> B C <p style="5"> D </p> <p style="1"> Picture number 3? </p> """ for div in html.split('<div'): m = re.search(r'xml:lang="unknown">.+(<p[^<]+)', div, re.DOTALL) if m: print m.group(1) |
当您在一个块中并设置标志为真时,以及当您退出并设置标志为假并中断时,您可以这样解析一段块代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | def get_infobox(self): """returns Infobox wikitext from text blob learning form https://github.com/siznax/wptools/blob/master/wp_infobox.py """ if self._rawtext: text = self._rawtext else: text = self.get_rawtext() output = [] region = False braces = 0 lines = text.split(" ") if len(lines) < 3: raise RuntimeError("too few lines!") for line in lines: match = re.search(r'(?im){{[^{]*box$', line) braces += len(re.findall(r'{{', line)) braces -= len(re.findall(r'}}', line)) if match: region = True if region: output.append(line.lstrip()) if braces <= 0: region = False break self._infobox =" ".join(output) assert self._infobox return self._infobox |