Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.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 如何使用regex读取访问日志主机?_Python_Regex - Fatal编程技术网

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
    >>>