Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中对表达式应用多个负正则表达式_Python_Regex_Coding Style - Fatal编程技术网

在Python中对表达式应用多个负正则表达式

在Python中对表达式应用多个负正则表达式,python,regex,coding-style,Python,Regex,Coding Style,这个问题类似于,除了匹配一个正则表达式并做一些事情之外,我需要确保我没有匹配一组正则表达式,如果没有找到匹配项(也就是说我有有效数据),那么就做一些事情。我已经找到了一种方法,但我认为一定有更好的方法,特别是如果我最终得到了许多正则表达式 基本上,我是在过滤URL中的不好的东西(“,\ \”,等等),当我从HTML文档中拉出看起来像是有效的URL的东西,但它是JavaScript的一部分(因此需要进行评估,因此需要转义字符)。我不能使用Beauty soup来处理这些页面,因为它们很容易损坏(实

这个问题类似于,除了匹配一个正则表达式并做一些事情之外,我需要确保我没有匹配一组正则表达式,如果没有找到匹配项(也就是说我有有效数据),那么就做一些事情。我已经找到了一种方法,但我认为一定有更好的方法,特别是如果我最终得到了许多正则表达式

基本上,我是在过滤URL中的不好的东西(“,\ \”,等等),当我从HTML文档中拉出看起来像是有效的URL的东西,但它是JavaScript的一部分(因此需要进行评估,因此需要转义字符)。我不能使用Beauty soup来处理这些页面,因为它们很容易损坏(实际上,我使用BeautifulSoup,然后回到我丑陋但可行的解析器)

到目前为止,我发现以下方法效果相对较好:我在主循环之外编译了一个dict或正则表达式(因此我只需编译一次,但每次使用它时都会受益于速度的提高),然后通过这个dict循环一个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 ...
现在最明显的想法是使用regex“或”(“|”)”,即:

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

print "URL: ", url, " matched by key ", key
那么,是否有什么方法可以在充分利用这两个方面的优势(即比较次数最少)的同时仍然能够打印出与URL匹配的正则表达式,或者我只是需要咬紧牙关,在调试时让我的代码速度较慢,但更容易进行故障排除,然后将所有正则表达式一起放入一行进行生产?(这意味着编程和代码维护还有一个步骤以及可能出现的问题)

更新:

Dave Webb给出了一个很好的答案,因此实际代码如下所示:

match = re.search(r'(?P<double_quotes>\"\")|(?P<slash_quote>\\\")', fullurl)
if (match == None):
    # do stuff here ...
else:
    #optional for debugging
    print "url matched by", match.lastgroup
match=re.search(r'(?P\\”)|(?P\\”),完整URL)
如果(匹配==无):
#在这里做事。。。
其他:
#用于调试的可选选项
打印“url匹配人”,match.lastgroup
“Squoosh”将所有正则表达式放在一行中,但将每个正则表达式放在一个命名组中,然后使用查找匹配的正则表达式

match = re.search(r'(?P<double_quotes>\"\")|(?P<slash_quote>\\\")', fullurl)
if (match == None):
    # do stuff here ...
else:
    #optional for debugging
    print "url matched by", match.lastgroup