我正在检查一大堆文本,以查找特定的模式,基本上看起来像这样:
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)
但是,它根本不返回任何东西。怎么了我在网上看到了其他效果很好的示例。
答案 0 :(得分:5)
这里有多个问题。
"start(.+?)end"
是一个字符串,它描述了正则表达式,该表达式从字面上与start
匹配,然后与某些内容匹配,然后与end
匹配。变量start
和end
在这里根本无关紧要。
您可能打算在这里写start + "(.+?)" + end
。.
与换行符不匹配。 re.MULTILINE
在这里无关紧要,它仅更改^
和$
的行为(请参见docs)。您应该改用re.DOTALL
(请参阅docs)。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)