[英]Remove all numbers except for the ones combined to string using python regex
嘗試使用正則表達式函數刪除單詞、空格、特殊字符和數字,但不刪除與單詞/字符串組合的那個。 例如
ORIGIN
1 malwmrllp1 lallalwgpd paaafvnghl cgshlvealy lvcgergffy tpktrreaed
61 lqvgqvelgg gpgagslqpl alegslqkrg iveqcctsic slyqlenycn
//
\W+ 刪除包括 1 在內的所有數字 malwmrll1
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
和原始字符串表示法。 您當前使用了一個沒有意義的字符類:
\b(?!(?:ORIGIN|[_\d]+)\b)\w+
查看在線演示
\b
- 字邊界;(?!(?:ORIGIN|[_\d]+)\b)
- 帶有嵌套非捕獲組的負前瞻,以匹配尾隨字邊界之前的ORIGIN
或 1+ 下划線/數字組合;\w+
- 1+ 個單詞字符。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)
去除單詞邊界之間的所有非單詞字符+下划線或數字/“ORIGIN”。
在 tio.run 上查看這個演示(正則表達式非常基礎,在 regex101 進行解釋)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.