我正在尝试编写一个简单的python脚本
我只有从stdin获取值的部分并查找匹配的单词,之后我有点卡住了。
import re
import sys
for line in sys.stdin:
matchObj = re.search(r'<something>(.*)</something>',line)
if matchObj:
oldWord = matchObj.group(1)
print oldWord
foo的内容
<something>REPLACEME</something>
<blah>UNTOUCH</blah>
理想情况下,如果我运行此命令
cat foo | ./test.py
我会得到类似的东西
<something>NEWWORD</something
<blah>UNTOUCH</blah>
答案 0 :(得分:1)
您在寻找re.sub吗?
import re
import sys
for line in sys.stdin:
sys.stdout.write(re.sub(r'(<something>)REPLACEME(</something>)',
r'\1NEWWORD\2',
line))
在示例数据上运行以上内容:
$ echo '<something>REPLACEME</something>\n<something>UNTOUCH</something>' | python2 test.py
<something>NEWWORD</something>
<blah>UNTOUCH</blah>
请注意,使用正则表达式解析XML可能是一个坏主意。 Python标准库附带number of XML modules。
以下是一个例子:
import sys
import xml.etree.ElementTree
tree = xml.etree.ElementTree.parse(sys.stdin)
root = tree.getroot()
for node in root.iter('something'):
if node.text == 'REPLACEME':
node.text == 'NEWWORD'
tree.write(sys.stdout)
以上内容的工作方式相同:
$ echo '<root><something>REPLACEME</something>\n<blah>UNTOUCH</blah></root>' | python2 test.py
<root><something>REPLACEME</something>
<blah>UNTOUCH</blah></root>
答案 1 :(得分:0)
如果您运行cat foo | ./test.py
test.py: command not found
,则需要执行此操作:cat foo |python ./test.py
。
然后代码的输出将是:
REPLACEME
但是对于您想要的输出,您需要使用re.sub()
:
import re
import sys
for line in sys.stdin:
matchObj = re.sub(r'<something>(.*)</something>','<something>NEWWORD</something>',line)
if matchObj:
print matchObj
输出:
<something>NEWWORD</something>
<blah>UNTOUCH</blah>
另外,作为pythonic方式,您可以使用ElementTree XML API