尝试使用regex函数删除单词,空白,特殊字符和数字,但不包含与单词/字符串组合的字符。例如
ORIGIN
1 malwmrllp1 lallalwgpd paaafvnghl cgshlvealy lvcgergffy tpktrreaed
61 lqvgqvelgg gpgagslqpl alegslqkrg iveqcctsic slyqlenycn
//
W+删除malwmrll1
中的所有数字,包括1import 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)