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

ryg*_*y72 5 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) 
Run Code Online (Sandbox Code Playgroud)

我的文本变量已命名'html_page',我的起点和终点如下所示:

start = "new Set(["
end = "]);"
Run Code Online (Sandbox Code Playgroud)

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

r = re.findall("start(.+?)end",html_page,re.MULTILINE)
Run Code Online (Sandbox Code Playgroud)

但是,它根本没有返回任何东西.这有什么不对?我在网上看到了其他很好的例子.

yep*_*ons 5

这里有很多问题.

  1. 正如@EthanK在评论中所提到的,"start(.+?)end"在Python中是一个字符串,它描述了字面上匹配的正则表达式start,然后是一些东西,然后字面匹配end.变量start,end在这里根本不重要.你可能打算在start + "(.+?)" + end这里写一下.
  2. .在Python中与换行符不匹配.re.MULTILINE这里没关系,它只改变了行为^$(参见文档).您应该使用re.DOTALL(参见文档).
  3. 的价值观start,并end包括与正则表达式(如特殊含义的字符([).你必须确保他们没有得到特别的对待.您可以使用正确的数字手动转义它们,\或者只是委托该工作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)
Run Code Online (Sandbox Code Playgroud)