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