如何在 python 正则表达式中将数字大小限制为单个
How to limt the digit size into single in python regex
我有一个如下所示的文本文件:
INPUT.txt
155 Phe 12xD,7xQ,5xE,5xG,4xA,4xS,2xF,2xH,2xI,2xK,1xM,1xN
151 Glu 11xD,6xA,5xE,3xF,3xG,3xM,2xI,2xS,1xH,1xK,1xL,1xP
159 Thr 15xF,6xL,6xM,5xG,5xI,5xT,4xA,4xV,3xR,1xD,1xN,1xP
在这里,我的目标是:在第 3 列中保留大于等于 6 的数字:
所以,我所做的是:
我试图通过以下脚本将 1x(Anyleter),2x(Anyleter),3x(Anyleter),4x(Anyleter),5x(Anyleter) 替换为空:
filepointer = open(filename,"r") # Reading file
text = filepointer.read()
merged = text.splitlines()
for i in merged:
print re.sub("[0-5]x[a-zA-Z]","", i.rstrip())#Replace 1x,2x,3x,4x,5x by nothing
输出:
155 Phe 2,7xQ # 2xD belong to 12xD replaced
151 Glu 1,6xA # 1xD belong to 11xD replaced
159 Thr 5,6xL,6xM # 5xF belong to 15xF replaced
替换 1x,2x,3x,4x,5x 是完美的,但是当 这些 1x,2x,3x,4x,5x 属于 11x,12x,13x,14x,15x 时也会被替换。所以我想通过只替换一个数字而不是超过一个数字来限制这一点。
预期输出:
155 Phe 12xD,7xQ
151 Glu 11xD,6xA
159 Thr 15xf,6xL,6xM
我希望我的问题是可以理解的。
我只想把1替换成空
不是 1 属于 11,21,31,41 等等等等
提前致谢
您可以使用
re.sub(r",?\b[0-5]x[a-zA-Z]\b","", s)
正则表达式 - ,?\b[0-5]x[a-zA-Z]\b
- 具有 word boundary \b
以便 digit + x + 字母前后必须有非单词字符(不是[a-zA-Z0-9_]
)并且逗号在开头是可选的(因为?
匹配1或0出现前面的子模式)。
此外,请注意正则表达式最好使用 "raw" 字符串文字声明(参见 r""
表示法)。这样,我们在使用单词边界时就不必使用双反斜杠了。
另一种使用函数的方法-
reg.txt
内容如下-
155 Phe 12xD,7xQ,5xE,5xG,4xA,4xS,2xF,2xH,2xI,2xK,1xM,1xN
151 Glu 11xD,6xA,5xE,3xF,3xG,3xM,2xI,2xS,1xH,1xK,1xL,1xP
159 Thr 15xF,6xL,6xM,5xG,5xI,5xT,4xA,4xV,3xR,1xD,1xN,1xP
p = r"C:\reg.txt"
f = open(p,'rb').readlines()
def changer(l):
d= l.split(',')
dd = d[1:]
lst = ['6', '7', '8', '9']
s = [i for i in dd if i[0] in lst]
s.insert(0,d[0])
return ','.join(s)
for i in f:
print changer(i)
版画-
155 Phe 12xD,7xQ
151 Glu 11xD,6xA
159 Thr 15xF,6xL,6xM
我有一个如下所示的文本文件:
INPUT.txt
155 Phe 12xD,7xQ,5xE,5xG,4xA,4xS,2xF,2xH,2xI,2xK,1xM,1xN 151 Glu 11xD,6xA,5xE,3xF,3xG,3xM,2xI,2xS,1xH,1xK,1xL,1xP 159 Thr 15xF,6xL,6xM,5xG,5xI,5xT,4xA,4xV,3xR,1xD,1xN,1xP
在这里,我的目标是:在第 3 列中保留大于等于 6 的数字:
所以,我所做的是: 我试图通过以下脚本将 1x(Anyleter),2x(Anyleter),3x(Anyleter),4x(Anyleter),5x(Anyleter) 替换为空:
filepointer = open(filename,"r") # Reading file
text = filepointer.read()
merged = text.splitlines()
for i in merged:
print re.sub("[0-5]x[a-zA-Z]","", i.rstrip())#Replace 1x,2x,3x,4x,5x by nothing
输出:
155 Phe 2,7xQ # 2xD belong to 12xD replaced
151 Glu 1,6xA # 1xD belong to 11xD replaced
159 Thr 5,6xL,6xM # 5xF belong to 15xF replaced
替换 1x,2x,3x,4x,5x 是完美的,但是当 这些 1x,2x,3x,4x,5x 属于 11x,12x,13x,14x,15x 时也会被替换。所以我想通过只替换一个数字而不是超过一个数字来限制这一点。
预期输出:
155 Phe 12xD,7xQ 151 Glu 11xD,6xA 159 Thr 15xf,6xL,6xM
我希望我的问题是可以理解的。
我只想把1替换成空
不是 1 属于 11,21,31,41 等等等等
提前致谢
您可以使用
re.sub(r",?\b[0-5]x[a-zA-Z]\b","", s)
正则表达式 - ,?\b[0-5]x[a-zA-Z]\b
- 具有 word boundary \b
以便 digit + x + 字母前后必须有非单词字符(不是[a-zA-Z0-9_]
)并且逗号在开头是可选的(因为?
匹配1或0出现前面的子模式)。
此外,请注意正则表达式最好使用 "raw" 字符串文字声明(参见 r""
表示法)。这样,我们在使用单词边界时就不必使用双反斜杠了。
另一种使用函数的方法-
reg.txt
内容如下-
155 Phe 12xD,7xQ,5xE,5xG,4xA,4xS,2xF,2xH,2xI,2xK,1xM,1xN
151 Glu 11xD,6xA,5xE,3xF,3xG,3xM,2xI,2xS,1xH,1xK,1xL,1xP
159 Thr 15xF,6xL,6xM,5xG,5xI,5xT,4xA,4xV,3xR,1xD,1xN,1xP
p = r"C:\reg.txt"
f = open(p,'rb').readlines()
def changer(l):
d= l.split(',')
dd = d[1:]
lst = ['6', '7', '8', '9']
s = [i for i in dd if i[0] in lst]
s.insert(0,d[0])
return ','.join(s)
for i in f:
print changer(i)
版画-
155 Phe 12xD,7xQ
151 Glu 11xD,6xA
159 Thr 15xF,6xL,6xM