Dav*_*vid 67 python regex grep
我需要一种通过Unix命令行中的正则表达式使用grep搜索文件的方法.例如,当我输入命令行时:
python pythonfile.py 'RE' 'file-to-be-searched'
Run Code Online (Sandbox Code Playgroud)
我需要'RE'在文件中搜索正则表达式并打印出匹配的行.
这是我的代码:
import re
import sys
search_term = sys.argv[1]
f = sys.argv[2]
for line in open(f, 'r'):
if re.search(search_term, line):
print line,
if line == None:
print 'no matches found'
Run Code Online (Sandbox Code Playgroud)
但是当我输入一个不存在的单词时,no matches found不会打印
Nic*_*cue 75
自然的问题是为什么不只是使用grep ?! 但假设你不能......
import re
import sys
file = open(sys.argv[2], "r")
for line in file:
if re.search(sys.argv[1], line):
print line,
Run Code Online (Sandbox Code Playgroud)
注意事项:
search而不是match在字符串中找到任何地方,后的逗号()print行(将有一个)argv 包含python文件名,因此变量需要从1开始这不处理多个参数(如grep)或扩展通配符(如Unix shell).如果您想要此功能,可以使用以下方法获取它:
import re
import sys
import glob
for arg in sys.argv[2:]:
for file in glob.iglob(arg):
for line in open(file, 'r'):
if re.search(sys.argv[1], line):
print line,
Run Code Online (Sandbox Code Playgroud)
Gia*_*lli 13
简洁和内存效率:
#!/usr/bin/env python
# file: grep.py
import re, sys
map(sys.stdout.write,(l for l in sys.stdin if re.search(sys.argv[1],l)))
Run Code Online (Sandbox Code Playgroud)
它像egrep一样工作(没有太多的错误处理),例如:
cat input-file | grep.py "RE"
Run Code Online (Sandbox Code Playgroud)
以下是单行:
cat input-file | python -c "import re,sys;map(sys.stdout.write,(l for l in sys.stdin if re.search(sys.argv[1],l)))" "RE"
Run Code Online (Sandbox Code Playgroud)
接受文件名列表[2:],不进行异常处理:
#!/usr/bin/env python
import re, sys, os
for f in filter(os.path.isfile, sys.argv[2:]):
for line in open(f).readlines():
if re.match(sys.argv[1], line):
print line
Run Code Online (Sandbox Code Playgroud)
sys.argv[1]resp sys.argv[2:]工作,如果你把它作为独立的可执行文件运行,意思是
chmod +x
第一