簡體   English   中英

python正則表達式轉義字符

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM