gpt4 book ai didi

python - 是否可以使用 argparse 将正则表达式字符串作为参数传递给 Python CLI 工具?

转载 作者:太空狗 更新时间:2023-10-29 12:11:23 25 4
gpt4 key购买 nike

我正在编写脚本来搜索日志文件以查找给定的 Python 正则表达式模式。撇开使用简单的 Bash 脚本容易做这件事这一事实不谈,它可以用 Python 完成吗?这是我遇到的:

假设:

  • 我正在尝试分析文件 /var/log/auth.log
    • (为了简单起见,我省略了选择文件的功能。)
  • 我的 cli 模块的名称是 logscour
  • 为了论证,logscour 只接受一个名为 regex_in 的 arg。

预期用途:

[root@localhost]: # logscour '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}'

应该返回 /var/log/auth.log 中包含 IPv4 地址的行。

我想找到一种反re.escape(),因为我在反斜杠 hell 。这是一个片段:

import re
import argparse

def main(regex_in, logfile='/var/log/auth.log'):
## Herein lies the problem!
# user_regex_string = re.escape(regex_in) #<---DOESN'T WORK, EVEN MORE ESCAPE-SLASHES
# user_regex_string = r'{}'.format(regex_in) #<---DOESN'T WORK
user_regex_string = regex_in #<---DOESN'T WORK EITHER GAHHH

with open(logfile, 'rb+') as authlog:
for aline in authlog:
if re.match(user_regex_string, aline):
print aline

if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument("regex_in", nargs="?", help="enter a python-compliant regex string. Parentheses & matching groups not supported.", default=None)

args = parser.parse_args()
if not args.regex_in:
raise argparse.ArgumentError('regex_in', message="you must supply a regex string")
main(args.regex_in)

由于我使用的是 Python2.7 并且这些是我正在处理的字节串这一事实,正如人们所期望的那样,这没有给我任何返回。

有谁知道将 'foo' 转换为 r'foo're.escape() 的“相反”方法>?

最佳答案

user_regex_string = re.compile(regex_in)

re.search(user_regex_string, aline)

应该可以正常工作。你需要re.search而不是 re.match因为 IP 地址不一定在一行的开头。

我总是发现 re.match 非常方便,可以在我的代码中引入细微的错误。 :)

在我的服务器上,logscour '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}' 输出:

May 28 17:38:53 dmzXX sshd[1736]: Received disconnect from 123.200.20.158: 11: Bye Bye [preauth]
May 28 17:38:54 dmzXX sshd[1738]: Invalid user guest from 123.200.20.158
...

也就是说 grep -P 'pattern' file 也可以:

grep -P "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}" /var/log/auth.log

-P代表:

   -P, --perl-regexp
Interpret PATTERN as a Perl regular expression (PCRE, see below). This is highly experimental and grep -P may warn of unimplemented features.
需要

-P 才能将 \d 解释为 [0-9]

关于python - 是否可以使用 argparse 将正则表达式字符串作为参数传递给 Python CLI 工具?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44269088/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com