我有一大块文本正在检查特定的模式,它看起来基本上是这样的:
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)
然而,它根本没有返回任何内容。这里怎么了?我在网上看到了其他很好的例子。
这里有多个问题。
- 正如@EthanK在评论中所提到的,Python中的
"start(.+?)end"
是一个字符串,它描述了正则表达式,它与start
、something和end
匹配。变量start
和end
在这里根本不重要。您可能打算在此处编写start + "(.+?)" + end
- Python中的
.
与换行符不匹配。re.MULTILINE
在这里并不重要,它只会改变^
和$
的行为(请参阅文档(。您应该使用re.DOTALL
(请参阅文档( 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)