7

我有一个文本列表,可以重新使用以下内容:re.sub('0000', '1111',data).

^(.{4})(.{4})(.{3})(.{3})在 shell 中使用\1\4\2\3一个输入的替换模式也可以正常工作。但是,我在列表中使用此模式的尝试在第一行给我带来了不希望的结果,并且永远不会替换后者。我在这里想念什么?

"0000-22N-06W-01"
"0000-22N-06W-02"
"0000-22N-06W-03"
"0000-22N-06W-04"

import re
o = open("output.txt","w")
data = open("input.txt").read()
o.write(re.sub(r'^(.{4})(.{4})(.{3})(.{3})', r'\1\4\2\3',data))
o.close()
4

3 回答 3

9
"0000-22N-06W-01"
"0000-22N-06W-02"
"0000-22N-06W-03"
"0000-22N-06W-04"

import re
output = open("output.txt","w")
input = open("input.txt")

for line in input:
    output.write(re.sub(r'^(.{4})-(.{3})-(.{3})-(.{2})$', r'\1-\4-\2-\3', line))

input.close()
output.close()

注意:如果您"的数据中确实有,那么您应该将您的正则表达式更改为这个:

^"(.{4})-(.{4})-(.{3})-(.{3})"$

正则表达式 101 演示

于 2013-09-21T17:45:41.707 回答
2

如果你还想用.read(),试试这个:

import re
output = open("output.txt","w")
input = open("input.txt").read()

output.write(re.sub(r'^(.{4})(.{4})(.{4})(.{3})$',
                    r'\1\4\2\3', 
                    input, 
                    flags=re.M))

output.close()
于 2013-09-21T18:20:56.840 回答
0

这 ?:

import re

t = """0000-22N-06W-01
0000-22N-06W-02\t\t
0000-22N-06W-03   \t\t\t\t
0000-22N-06W-04"""
print t,'\n'

print re.sub(r'^(.{4})(.{4})(.{4})([^ \t\r\n]+)',
             r'\1\4\2\3',
             t,
             flags= re.M)

生产

0000-22N-06W-01
0000-22N-06W-02     
0000-22N-06W-03                 
0000-22N-06W-04 

0000-01-22N-06W
0000-02-22N-06W     
0000-03-22N-06W                 
0000-04-22N-06W

曾几何时,我花了 1 个小时才明白,正则表达式需要re.M写在之后,flags=因为 re.sub 的签名是re.sub(pattern, repl, string, count=0, flags=0)

于 2013-09-21T18:45:23.003 回答