删除所有数字,除了使用python regex组合成字符串的数字



尝试使用regex函数删除单词,空白,特殊字符和数字,但不包含与单词/字符串组合的字符。例如

ORIGIN
1 malwmrllp1 lallalwgpd paaafvnghl cgshlvealy lvcgergffy tpktrreaed
61 lqvgqvelgg gpgagslqpl alegslqkrg iveqcctsic slyqlenycn
//

W+删除malwmrll1

中的所有数字,包括1
import re
text_file = open('mytext.txt').read()
new_txt = re.sub('[\b\d+\bs*$+sORIGIN$W+]', '', text_file)
print(new_txt, len(new_txt))
我的输出是:
malwmrllplallalwgpdpaaafvnghlcgshlvealylvcgergffytpktrreaedlqvgqvelgggpgagslqplalegslqkrgiveqcctsicslyqlenycn 109

期望输出应该是:malwmrll1plallalwgpdpaaafvnghlcgshlvealylvcgergffytpktrreaedlqvgqvelgggpgagslqplalegslqkrgiveqcctsicslyqlenycn 110

正确,根据您想要的结果是否显示下划线,尝试使用re.findall和原始字符串表示法。您当前使用的字符类没有意义:


b(?!(?:ORIGIN|[_d]+)b)w+

查看在线演示


  • b- Word-boundary;
  • (?!(?:ORIGIN|[_d]+)b)-使用嵌套的非捕获组来匹配ORIGIN或1+下划线/数字组合;
  • w+- 1+ word-characters.

import re

text_file = """ORIGIN
1 malwmrllp1 lallalwgpd paaafvnghl cgshlvealy lvcgergffy tpktrreaed
61 lqvgqvelgg gpgagslqpl alegslqkrg iveqcctsic slyqlenycn
//"""
new_txt=''.join(re.findall(r'b(?!(?:ORIGIN|[_d]+)b)w+', text_file))    
print(new_txt, len(new_txt))

打印:

malwmrllp1lallalwgpdpaaafvnghlcgshlvealylvcgergffytpktrreaedlqvgqvelgggpgagslqplalegslqkrgiveqcctsicslyqlenycn 110

使用RE进行此操作是一个有趣的学术练习,但是扩展该功能充满了危险,除非您非常熟悉该技术。

这个答案可能看起来很冗长,但您应该能够看到扩展它是多么容易,以便可以排除或包含其他令牌/模式。它也很容易维护,因为其他人在试图弄清楚RE是如何工作的时候,不会因为修改代码而头疼。

FILENAME = 'mytext.txt'
def keep(t):
if t.isdigit() or t == 'ORIGIN' or t == '//':
return False
return True
with open(FILENAME) as f:
new_txt = ''.join(filter(keep, f.read().split()))
print(new_txt, len(new_txt))

输出:

malwmrllp1lallalwgpdpaaafvnghlcgshlvealylvcgergffytpktrreaedlqvgqvelgggpgagslqplalegslqkrgiveqcctsicslyqlenycn 110

另一个想法:

new_txt = re.sub('[\W_]+|\b(?:\d+|ORIGIN)\b', '', text_file)

删除所有非单词字符+下划线或数字/" original "在字边界之间

在tio.run中查看这个演示(正则表达式是非常基本的,解释见regex101)

最新更新