尝试使用regex在起点和终点之间查找一个大字符串



我有一大块文本正在检查特定的模式,它看起来基本上是这样的:

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. 正如@EthanK在评论中所提到的,Python中的"start(.+?)end"是一个字符串,它描述了正则表达式,它与start、something和end匹配。变量startend在这里根本不重要。您可能打算在此处编写start + "(.+?)" + end
  2. Python中的.与换行符不匹配。re.MULTILINE在这里并不重要,它只会改变^$的行为(请参阅文档(。您应该使用re.DOTALL(请参阅文档(
  3. 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)

最新更新