ユーザー エージェントが Safari に関係するかどうかを調べるには、Chrome ではなく Safari の存在を探す必要があります。また、これは大文字と小文字を区別しない必要があると想定しています。
その後、文字列を照合するためにグループをトラバースする必要なく、Python で正規表現を使用してこれを実行しようとしています。
これを解決する1つの方法は次のとおりです。
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"
私も試してみました
r = re.compile ("(?P<s>Safari)|(?P<c>Chrome)", re.I)
m = r.search (userAgentString)
if (m.group('s') and not m.group('c')):
print "Found Safari"
「Chrome」または「Safari」のいずれかの最初のインスタンスを見つけた後に検索が停止するため、これは機能しません (おそらく正規表現の専門家には明らかです..)。
次のように re.finditer() 関数を使用して、わずかに効率的に動作させることができます。
r = re.compile ("(?P<s>Safari)|(?P<c>Chrome)", re.I)
safari = chrome = False
for i in r.finditer (userAgentString):
if i.group('s'):
safari = True
if i.group('c'):
chrome = True
if safari and not chrome:
print "Found Safari"
これを行うためのより効率的な方法はありますか? (利便性ではなく効率性を求めていることに注意してください)。ありがとう。
サンプル ユーザー エージェント:
Safari : "Mozilla/5.0 (iPad; Mac OS X のような CPU OS 6_0) AppleWebKit/536.26 (Gecko のような KHTML) バージョン/6.0 Mobile/10A5355d Safari/8536.25"
Chrome : "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML、Gecko など) Chrome/32.0.1667.0 Safari/537.36"
それだけの価値があるので、私はそれを計りました.jwodderは、単純な「lower()」と「in」の効率でマークされています。コンパイル済みの正規表現よりも約 10 倍高速であることが判明しました。setup/timeitで何か間違ったことをしない限り..
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