![](/img/trans.png)
[英]Remove rows that contain more than one occurrence of a character (in any column)
[英]How to remove a word if it has more than 2 occurrence of a given character in python?
我正在解析一個日志文件,其中包含如下幾行:
Pushing the logs into /var/log/my_log.txt
Pushing the logs into /opt/test/log_file.txt
這些行多次出現並帶有自動生成的路徑(/.../.../...)
我想將其更改為通用形式,例如:
Pushing the logs into PATH
我嘗試使用正則表達式選擇一個帶有多個正斜杠的單詞,然后將其替換為“PATH”,如下所示:
line = re.sub(r'\b([\/A-Z]*\/[A-Z]*){1,}\b',' PATH ',line)
只有正斜杠被替換,而不是整個單詞。
這個概念很新。 難道我做錯了什么? 感謝所有幫助。 謝謝。
你可以使用:
import re
line = 'Pushing the logs into /var/log/my_log.txt'
pat = r'(?<!\S)(/\S+){2,}'
line = re.sub(pat, 'PATH', line)
print(line)
這並沒有完全按照說明進行回答,因為它查找必須以/
開頭並且還包含兩個或多個/
(每個/
后面有其他非空白字符)的“單詞”——因此它將涵蓋例如/tmp/my_log.txt
我認為這更好地涵蓋了您會找到的那種字符串——如果它們是絕對路徑,那么/
將始終是第一個字符,同樣,如果它們是文件而不是目錄,那么最后一個/
不會在最后(盡管我沒有費心在最后排除一個/
,前提是它之前也至少有兩個)。 如果您只想查找例如 3 或更多/
(而不是最后),則將 2 更改為 3,但是如果您這樣做,您將錯過/tmp/my_log.txt
。
正則表達式的第一位(?<!\\S)
是一個否定的lookbehind 斷言,意思是“前面沒有非空白字符”,即它將在“單詞”的開頭或行的開頭匹配。 下一位(/\\S+)
表示/
后跟一個或多個非空白字符(可能包括/
- 這無關緊要,所以我沒有費心排除這些)。 而{2,}
意味着應該有兩個或更多這些。
(我在這里使用“單詞”作為問題,指的是非空白字符的序列,不一定是字母。)
僅匹配正斜杠,因為字符串是小寫的,並且模式使用[\\/AZ]*
匹配正斜杠或大寫字符 AZ 零次或多次
您可以使用re.IGNORECASE
使模式不區分大小寫,但它不會匹配示例數據中的下划線和點。
當您以單詞邊界\\b
開始模式時,第一個正斜杠不會匹配,但空格和第一個正斜杠之間沒有單詞邊界。
更具體的匹配可以使用\\w
來匹配單詞字符並指定擴展名的點:
(?<!\S)(?:/\w+)+/\w+\.\w+(?!\S)
(?<!\\S)
斷言左邊的空白邊界(?:/\\w+)+
匹配 1 次或多次 a /
后跟 1+ 個單詞字符/\\w+\\.\\w+
匹配最后一個/
后跟使用點和字字符的文件名格式(?!\\S)
斷言右側的空白邊界import re
line = 'Pushing the logs into /var/log/my_log.txt'
line = re.sub(r'(?<!\S)(?:/\w+)+/\w+\.\w+(?!\S)', 'PATH', line)
print(line)
輸出
Pushing the logs into PATH
更廣泛的模式可以匹配 2 倍的正斜杠並使用否定字符類來匹配除正斜杠或換行符之外的任何字符
(?<!\S)(?:/[^/\r\n]+){2,}
查看另一個正則表達式演示
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.