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

标签 python regex linux bash python-2.7

我正在编写脚本来搜索日志文件以查找给定的 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/

相关文章:

objective-c - 最佳实践 : Partial Regex Matching

linux - 如何运行从当前 rpm 规范文件安装 rpm 的 bash 脚本?

linux - 如何在 Expect 脚本中返回生成的进程退出代码?

python - datetime strftime 不输出正确的时间戳

php - 帮助使用 PHP 中的正则表达式(解析维基百科标记)

php - 需要一个正则表达式来检查字符串是否只包含字母 a-z 和数字以及下划线 (_) 和连字符 (-)

android - 如何在 Android 上的 LXC 容器中运行 Linux 发行版?

python - 为什么 Django 不为应用程序提供 urls.py 文件?

Python - MySQL SSL 连接

python - 将文本解析到它自己的字段中,进行计数,并将选择的字段 reshape 为宽格式