Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.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中查找Safari的高效用户代理Regex_Python_Regex_Python 2.7_User Agent - Fatal编程技术网

在Python中查找Safari的高效用户代理Regex

在Python中查找Safari的高效用户代理Regex,python,regex,python-2.7,user-agent,Python,Regex,Python 2.7,User Agent,要确定用户代理是否与Safari相关,必须查找Safari的存在,而不是Chrome的存在。我还假设这需要不区分大小写 我试图在Python中使用正则表达式来实现这一点,而不需要随后遍历组来匹配字符串 解决这一问题的一种方法是: r1 = re.compile ("Safari", re.I) r2 = re.compile ("Chrome", re.I) if len(r1.findall (userAgentString)) > 0 and len(r2.findall(userA

要确定用户代理是否与Safari相关,必须查找Safari的存在,而不是Chrome的存在。我还假设这需要不区分大小写

我试图在Python中使用正则表达式来实现这一点,而不需要随后遍历组来匹配字符串

解决这一问题的一种方法是:

r1 = re.compile ("Safari", re.I)
r2 = re.compile ("Chrome", re.I)

if len(r1.findall (userAgentString)) > 0 and len(r2.findall(userAgentString)) <=0):
    print "Found Safari"
r1=re.compile(“Safari”,re.I)
r2=重新编译(“Chrome”,re.I)

如果len(r1.findall(userAgentString))>0和len(r2.findall(userAgentString)),因为您正在测试某些固定字符串是否出现在给定字符串中,那么完全放弃正则表达式可能是最简单、最有效的方法:

if 'safari' in userAgentString.lower() and 'chrome' not in userAgentString.lower():
    print "Found Safari"

因为您正在测试特定的固定字符串是否出现在给定字符串中,所以完全放弃正则表达式可能是最简单、最有效的方法:

if 'safari' in userAgentString.lower() and 'chrome' not in userAgentString.lower():
    print "Found Safari"

请包含示例用户代理字符串好吗?请包含示例用户代理字符串好吗?我想知道降低userAgentString()的成本是多少?在你的情况下,你打了两次电话。我还想知道,在整个userAgent字符串中,哪个更快一点,然后是一个'in'2倍,或者是一个regex。(请注意,我可以在启动时编译一次正则表达式,每次只调用用户代理字符串上的search()函数。。(如果我遗漏了什么,很抱歉)@user1055761:运行一些测试(比如,使用)并找出答案。
.lower()
method函数非常便宜,但使用一个变量来避免对其进行两次求值非常容易,这就是我的建议。为什么您如此担心效率?无论您采用哪种方法,性能都不会有显著差异。我使用timeit运行了测试,jwodder是正确的!我补充道这是一个主要问题。我想知道在userAgentString上使用lower()的代价是什么?在您的情况下,您要调用它两次。我还想知道,在整个userAgent字符串上使用lower()然后使用'In'2次或正则表达式哪个更快。(请注意,我可以在启动时编译一次正则表达式,只调用search()每次在用户代理字符串上运行函数…(如果我遗漏了什么,请抱歉)@user1055761:运行一些测试(比如,使用)并找出答案。
.lower()
method函数非常便宜,但使用一个变量来避免对其进行两次求值非常容易,这就是我的建议。为什么您如此担心效率?无论您采用哪种方法,性能都不会有显著差异。我使用timeit运行了测试,jwodder是正确的!我补充道这是主要问题。
    import timeit
    setup = '''
import re
r = re.compile ('(?P<m>MSIE)|(?P<c>Chrome)|(?P<s>Safari)', re.I)
def strictBrowser (userAgentString):
    c=s=m=False
    for f in r.finditer(userAgentString):
        if f.group('m'):
            m = True
        if f.group('c'):
            c = True
        if f.group('s'):
            s = True
    # msie or (safari but not chrome)
    # all chromes us will have safari in them..
    return m or (s and not c)
'''
    print timeit.timeit(
        'strictBrowser ("Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5355d Safari/8536.2")',
        setup=setup, number=100000
        )
    setup = '''
def strictBrowser (userAgentString):
    userAgentString = userAgentString.lower()
    if (
        'msie' in userAgentString or
        ('safari' in userAgentString and 'chrome' not in userAgentString)
        ):
        return True
    return False
'''
    print timeit.timeit(
        'strictBrowser ("Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5355d Safari/8536.2")',
        setup=setup, number=100000
        )

Output :
0.0778814506637
0.00664118263765
if 'safari' in userAgentString.lower() and 'chrome' not in userAgentString.lower():
    print "Found Safari"