我有一个包含数据的“输出”文件
cell (XOR4DGHFDH22DSVT) {
cell (ND2DGH557GGHDSVT) {
cell (SDK1DNG45GKDSVT) {
我希望输出是
XOR4DGHFDH22DSVT
ND2DGH557GGHDSVT
SDK1DNG45GKDSVT
我想在另一个文件中使用 Python 2.7.5 获得此输出。
我尝试使用re.findall()
但split()
无法得到它。我使用的代码是:
c2= open("out1", 'w')
file1= open("out","r")
for c in file1:
split_lines = c.split(" ")
print(split_lines[1]) >> c2
答案1
$ python3 -c 'import sys
with open(sys.argv[1]) as f:
for l in f:
a, b = map(lambda x: l.find(x), ["(",")"])
print(l[a+1:b])
' out > out1
$ cat out1
XOR4DGHFDH22DSVT
ND2DGH557GGHDSVT
SDK1DNG45GKDSVT
- 惯用的方法/Pythonic 方法是使用该
with-open
子句,因为它会在 eof 处自动关闭文件描述符,并且还会处理 open 中的错误。 - 记录字符在当前行中的位置
(
,)
并使用字符串切片符号来提取单元格名称。 - 假设
)
之前没有发生过(
答案2
使用 Python重新模块和积极的后向查找,以便我们找到匹配之前的字符串,但不会将其用于结果。
在输入文件中查找所有匹配项并将它们逐行打印到输出文件中:
import re
with open('input_file.txt', 'r') as f:
m = re.findall('(?<=cell \()[^)]*', f.read())
with open('output_file.txt', 'w') as f:
for x in m:
f.write(x+"\n")
这是正则表达式的一些解释:
'(?<= cell \( ) [^)]*'
positive look-behind= ------- match all to the next closing parenthesis
您可以将正则表达式修改为更严格的形式:
'(?<=cell \()[^)]*(?=\) {)'
如果您还想使用前瞻功能,请) {
在任何匹配之后明确要求。
测试
> cat input_file.txt
cell (XOR4DGHFDH22DSVT) {
test(test)
}
cell (ND2DGH557GGHDSVT) {
cell (SDK1DNG45GKDSVT) {
> python3 test.py
> cat output_file.txt
XOR4DGHFDH22DSVT
ND2DGH557GGHDSVT
SDK1DNG45GKDSVT
答案3
您可以链接各种拆分操作来获取单元名称。
python3 -c '
import sys
with open(sys.argv[1]) as f:
for l in f:
print(l.split("(")[1].split(")")[0])
' input_file
XOR4DGHFDH22DSVT
ND2DGH557GGHDSVT
SDK1DNG45GKDSVT