Python 如何使用regex读取访问日志主机?
我有这样的条目:Python 如何使用regex读取访问日志主机?,python,regex,Python,Regex,我有这样的条目: e179206120.adsl.alicedsl.de safecamp-plus-2098.unibw-hamburg.de p5B30EBFE.dip0.t-ipconnect.de 我只想匹配主域名,比如 alicedsl.de unibw-hamburg.de t-ipconnect.de 我尝试了这个\.\w+\.\w+\.\w{2,3},但它与.adsl.alicedsl.de如何[^.]+\.\w+$ 或者,在Python中: import re tgt=
e179206120.adsl.alicedsl.de
safecamp-plus-2098.unibw-hamburg.de
p5B30EBFE.dip0.t-ipconnect.de
我只想匹配主域名,比如
alicedsl.de
unibw-hamburg.de
t-ipconnect.de
我尝试了这个
\.\w+\.\w+\.\w{2,3}
,但它与.adsl.alicedsl.de
如何[^.]+\.\w+$
或者,在Python中:
import re
tgt='''\
e179206120.adsl.alicedsl.de
safecamp-plus-2098.unibw-hamburg.de
p5B30EBFE.dip0.t-ipconnect.de'''
print re.findall(r'([^.]+\.\w+$)', tgt, re.M | re.S)
# ['alicedsl.de', 'unibw-hamburg.de', 't-ipconnect.de']
正则表达式解释:
[^.]+
1个或多个字符,文字除外
\.
literal
它需要\
,因为如果不使用它,它将是正则表达式的任何一个chaarcter\w+
范围为[a-z][a-z][0-9][uz]
的1个或多个字符是[a-zA-z]+
,因为不存在任何非ASCII的旧的TLD。如果你想管理更新的,你需要一个不同的正则表达式$
行末尾的断言您应该知道,TLD的定义不完整。例如,此正则表达式方法将破坏的合法url和许多其他包含公共SLD的url。如果可以,请使用库以获得更广泛的适用性。您还可以使用来了解何时适合在主机的定义中包含两个句点 如果您对使用外部库没有限制,请查看TLD extract library
您可以在给定数据中使用以下内容
[^.]+\.[^.]+$
请参见您实际上不需要正则表达式。A将更有效率:
>>> mystr = """
... e179206120.adsl.alicedsl.de
... safecamp-plus-2098.unibw-hamburg.de
... p5B30EBFE.dip0.t-ipconnect.de
... """
>>> [".".join(line.rsplit(".", 2)[-2:]) for line in mystr.splitlines() if line]
['alicedsl.de', 'unibw-hamburg.de', 't-ipconnect.de']
>>>
另外,如果您需要,这里有一个关于的参考(它解释了str.splitlines
,str.rsplit
,和str.join
)
如果使用运行速度测试,您将看到列表理解速度要快得多:
>>> from timeit import timeit
>>> mystr = """
... e179206120.adsl.alicedsl.de
... safecamp-plus-2098.unibw-hamburg.de
... p5B30EBFE.dip0.t-ipconnect.de
... """
>>> def func():
... import re
... re.findall(r'([^.]+\.\w+$)', mystr, re.M | re.S)
...
>>> timeit("func()", "from __main__ import func") # Regex's time
51.85605544838802
>>> def func():
... [".".join(line.rsplit(".", 2)[-2:]) for line in mystr.splitlines() if line]
...
>>> timeit("func()", "from __main__ import func") # List comp.'s time
12.113929004943316
>>>
你能解释一下你的正则表达式吗?
>>> from timeit import timeit
>>> mystr = """
... e179206120.adsl.alicedsl.de
... safecamp-plus-2098.unibw-hamburg.de
... p5B30EBFE.dip0.t-ipconnect.de
... """
>>> def func():
... import re
... re.findall(r'([^.]+\.\w+$)', mystr, re.M | re.S)
...
>>> timeit("func()", "from __main__ import func") # Regex's time
51.85605544838802
>>> def func():
... [".".join(line.rsplit(".", 2)[-2:]) for line in mystr.splitlines() if line]
...
>>> timeit("func()", "from __main__ import func") # List comp.'s time
12.113929004943316
>>>