尝试使用正则表达式在起点和终点之间找到大字符串

时间:2018-12-20 21:29:09

标签: python regex python-3.x

我正在检查一大堆文本,以查找特定的模式,基本上看起来像这样:

     unique_options_search = new Set([
            "updates_EO_LTB",
            "us_history",
            "uslegacy",

etc., etc., etc.

        ]);

      $input.typeahead({
        source: [...unique_options_search],
        autoSelect: false,
        afterSelect: function(value) 

我的文本变量名为'html_page',我的起点和终点看起来像这样:

start = "new Set(["
end = "]);"

我以为我可以用这种单线找到想要的东西:

r = re.findall("start(.+?)end",html_page,re.MULTILINE)

但是,它根本不返回任何东西。怎么了我在网上看到了其他效果很好的示例。

1 个答案:

答案 0 :(得分:5)

这里有多个问题。

  1. 正如@EthanK在评论中提到的那样,Python中的"start(.+?)end"是一个字符串,它描述了正则表达式,该表达式从字面上与start匹配,然后与某些内容匹配,然后与end匹配。变量startend在这里根本无关紧要。 您可能打算在这里写start + "(.+?)" + end
  2. Python中的
  3. .与换行符不匹配。 re.MULTILINE在这里无关紧要,它仅更改^$的行为(请参见docs)。您应该改用re.DOTALL(请参阅docs)。
  4. startend的值包括在正则表达式中具有特殊含义的字符(例如([)。您必须确保未对它们进行特殊对待。您可以使用正确数量的\手动进行转义,也可以简单地将工作委托给re.escape以获得与您的需求完全匹配的正则表达式。

将所有内容组合在一起:

import re
html_page = """
     unique_options_search = new Set([
            "oecd_updates_EO_LTB",
            "us_history",
            "us_legacy",

etc., etc., etc.

        ]);

      $input.typeahead({
        source: [...unique_options_search],
        autoSelect: false,
        afterSelect: function(value) 
"""

start = "new Set(["
end = "]);"
# r = re.findall("start(.+?)end",html_page,re.MULTILINE)  # Old version
r = re.findall(re.escape(start) + "(.+?)" + re.escape(end), html_page, re.DOTALL)  # New version
print(r)