python - 将多个负正则表达式应用于Python中的表达式

标签 python regex

这个问题类似于"How to concisely cascade through multiple regex statements in Python"除了匹配一个正则表达式并做一些事情之外,我需要确保我不匹配一堆正则表达式,如果没有找到匹配项(又名我有有效数据),那么做一些事情。我已经找到了一种方法来做到这一点,但我认为必须有更好的方法,特别是如果我最终得到许多正则表达式。

基本上,我正在过滤 URL 中的不良内容(“”、\\”等),当我从 HTML 文档中提取看似有效的 URL,但结果发现它是 JavaScript 的一部分(并且因此需要进行评估,因此需要评估转义字符)。我无法使用 Beautiful soup 来处理这些页面,因为它们已经被破坏了(实际上我使用 BeautifulSoup,然后回到我丑陋但可行的解析器)。

到目前为止,我发现以下工作相对较好:我在主循环之外编译一个字典或正则表达式(所以我只需要编译一次,但每次使用它时都会受益于速度的提高),然后我通过这个字典循环一个 URL,如果有匹配则该 URL 是坏的,如果没有匹配则该 url 是好的:

regex_bad_url = {"1" :   re.compile('\"\"'),
                 "2" :   re.compile('\\\"')}

随后:

url_state = "good"

for key, pattern in regex_bad_url_components.items():
    match = re.search(pattern, url)
    if (match):
        url_state = "bad"

if (url_state == "good"):
# do stuff here ...

现在明显的想法是使用正则表达式“或”(“|”),即:

re.compile('(\"\"|\\\")')

这减少了比较次数等,但使故障排除变得更加困难(每个比较一个表达式,我可以轻松添加一条打印语句,例如:

print "URL: ", url, " matched by key ", key

那么有没有什么办法可以两全其美(即最少的比较次数),但仍然能够打印出哪个正则表达式与 URL 匹配,或者我只需要硬着头皮让速度变慢但更容易在调试时排除代码故障,然后将所有正则表达式压缩到一行以进行生产? (这意味着多了一步编程和代码维护以及可能出现的问题)。

最佳答案

将所有正则表达式“Squoosh”放入一行,但使用 (?P<name>...) 将每个正则表达式放入命名组中然后使用 MatchOjbect.lastgroup 找到匹配的。

关于python - 将多个负正则表达式应用于Python中的表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/739651/

相关文章:

java - 正则表达式模式不匹配

javascript - 仅从字符串中获取数字

regex - Laravel 验证小数 0-99.99

python - 使用 Pyramid 提供 GridFS 文件

python - 从 datetime64[ns, UTC], Python 中提取年月日

python - Django 设置在运行时基于环境以编程方式设置模块

python - 如何使用基于集合的逻辑将计算列添加到 pandas 数据框?

python - 使用 pymongo 和 flask 插入数据

javascript - 将多个 url 中的 "."替换为 [dots] 字符串

c# - 正则表达式可选部分中的捕获组