![](/img/trans.png)
[英]How to escape Python Regex special characters without using backslash
[英]python regex escape characters
我們有:
>>> str
'exit\r\ndrwxr-xr-x 2 root root 0 Jan 1 2000
\x1b[1;34mbin\x1b[0m\r\ndrwxr-xr-x 3 root root
0 Jan 1 2000 \x1b[1;34mlib\x1b[0m\r\ndrwxr-xr-x 10 root
root 0 Jan 1 1970 \x1b[1;34mlocal\x1b[0m\r\ndrwxr-xr-x
2 root root 0 Jan 1 2000 \x1b[1;34msbin\x1b[0m\r\ndrwxr-xr-x
5 root root 0 Jan 1 2000 \x1b[1;34mshare\x1b[0m\r\n# exit\r\n'
>>> print str
exit
drwxr-xr-x 2 root root 0 Jan 1 2000 bin
drwxr-xr-x 3 root root 0 Jan 1 2000 lib
drwxr-xr-x 10 root root 0 Jan 1 1970 local
drwxr-xr-x 2 root root 0 Jan 1 2000 sbin
drwxr-xr-x 5 root root 0 Jan 1 2000 share
# exit
我想用regexp擺脫所有'\\ xblah [0m'廢話。 我試過了
re.sub(str, r'(\x.*m)', '')
但這並沒有成功。 有任何想法嗎?
你有幾個問題:
你以錯誤的順序將參數傳遞給re.sub錯誤。 它應該是:
re.sub(regexp_pattern,replacement,source_string)
該字符串不包含“\\ x”。 “\\ x1b”是轉義字符,它是一個單個字符。
正如interjay指出的那樣,你想要“。*?” 而不是“。*”,因為否則它將匹配從第一個逃逸到最后一個“m”的所有內容。
對re.sub的正確調用是:
print re.sub('\x1b.*?m', '', s)
或者,您可以使用:
print re.sub('\x1b[^m]*m', '', s)
您需要進行以下更改:
\\x
和最后一個m
之間的所有內容,這將在出現多個時出現問題。 結果:
re.sub(r'(\\x.*?m)', '', str)
這些是ANSI終端代碼 。 它們由ESC(字節27,在Python中看作為\\x1B
)發出信號,然后是[
,然后是一些;
- 分隔參數,最后是一個字母來指定它是哪個命令。 ( m
是顏色變化。)
參數通常是數字,所以對於這個簡單的情況,你可以用以下方法擺脫它們:
ansisequence= re.compile(r'\x1B\[[^A-Za-z]*[A-Za-z]')
ansisequence.sub('', string)
從技術上講,對於一些(非顏色相關的)控制代碼,它們可能是通用字符串,這使解析變得煩人。 很少見到你會遇到這些,但如果你這樣做,我想你必須使用像以下那樣復雜的東西:
\x1B\[((\d+|"[^"]*")(;(\d+|"[^"]*"))*)?[A-Za-z]
最好的方法是說服生成不是ANSI終端的字符串,這樣就不應該在輸出中包含顏色代碼。
嘗試運行ls --color=never -l
,而不是首先獲得ANSI轉義碼。
這是針對您的問題的pyparsing解決方案,為那些討厭的轉義序列提供了一般的解析表達式。 通過使用抑制表達式轉換初始字符串,將返回剝離表達式的所有匹配項的字符串。
s = \
'exit\r\ndrwxr-xr-x 2 root root 0 Jan 1 2000 ' \
'\x1b[1;34mbin\x1b[0m\r\ndrwxr-xr-x 3 root root ' \
'0 Jan 1 2000 \x1b[1;34mlib\x1b[0m\r\ndrwxr-xr-x 10 root ' \
'root 0 Jan 1 1970 \x1b[1;34mlocal\x1b[0m\r\ndrwxr-xr-x ' \
'2 root root 0 Jan 1 2000 \x1b[1;34msbin\x1b[0m\r\ndrwxr-xr-x ' \
'5 root root 0 Jan 1 2000 \x1b[1;34mshare\x1b[0m\r\n# exit\r\n' \
from pyparsing import (Literal, Word, nums, Combine,
delimitedList, oneOf, alphas, Suppress)
ESC = Literal('\x1b')
integer = Word(nums)
escapeSeq = Combine(ESC + '[' + delimitedList(integer,';') + oneOf(list(alphas)))
s_prime = Suppress(escapeSeq).transformString(s)
print s_prime
這將打印您所需的輸出,存儲在s_prime
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.