使用 python 正则表达式删除除组合成字符串的数字以外的所有数字

Remove all numbers except for the ones combined to string using python regex

尝试使用正则表达式函数删除单词、空格、特殊字符和数字,但不删除与 word/string 组合的那个。例如

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+\b\s*$+\sORIGIN$\W+]', '', text_file)

print(new_txt, len(new_txt))

我的输出是:

malwmrllplallalwgpdpaaafvnghlcgshlvealylvcgergffytpktrreaedlqvgqvelgggpgagslqplalegslqkrgiveqcctsicslyqlenycn 109

期望的输出应该是:malwmrll1plallalwgpdpaaafvnghlcgshlvealylvcgergffytpktrreaedlqvgqvelgggpgagslqplalegslqkrgiveqcctsicslyqlenycn 110

对,根据你想要的结果是否显示下划线,尝试使用 re.findall 和 raw-string 符号。您目前使用的字符 class 没有意义:


\b(?!(?:ORIGIN|[_\d]+)\b)\w+

网上看一个demo


  • \b - Word-boundary;
  • (?!(?:ORIGIN|[_\d]+)\b) - 带有嵌套 non-capture 组的否定前瞻匹配尾随 word-boundary 之前的 ORIGIN 或 1+ underscore/digit 组合;
  • \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 是一项有趣的学术练习,但扩展功能充满了危险,除非您非常熟悉该技术。

这个答案可能看起来 long-winded,但您应该能够看到扩展它是多么容易,以便可以排除或包含其他 tokens/patterns。它也很容易维护,因为任何其他必须修改代码的人都不会在试图弄清楚 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)

去除所有非单词字符 + 下划线或数字/单词边界之间的“ORIGIN”。

See this demo at tio.run (the regex is very basic, explanation at regex101)