2013-04-28 70 views
0

我想使函數找到數組中的字符串,然後從字典中替換相應的元素[ponding元素。到目前爲止,我已經試過,但我不能夠想出一些東西像我如何搜索和替換使用python正則表達式

  1. 如何特殊字符轉義
  2. 我可以用我找到的匹配替換。我想\1但沒有奏效

DSDS

def myfunc(h): 
     myarray = { 
       "#":"\\#", 
       "$":"\\$", 
       "%":"\\%", 
       "&":"\\&", 
       "~":"\\~{}", 
       "_":"\\_", 
       "^":"\\^{}", 
       "\\":"\\textbackslash{}", 
       "{":"\\{", 
       "}":"\\}"     
        } 
     pattern = "[#\$\%\&\~\_\^\\\\\{\}]" 
     pattern_obj = re.compile(pattern, re.MULTILINE) 
     new = re.sub(pattern_obj,myarray[\1],h) 

     return new 

回答

3

你正在尋找應用re.sub回調:

def myfunc(h): 
    rules = { 
      "#":r"\#", 
      "$":r"\$", 
      "%":r"\%", 
      "&":r"\&", 
      "~":r"\~{}", 
      "_":r"\_", 
      "^":r"\^{}", 
      "\\":r"\textbackslash{}", 
      "{":r"\{", 
      "}":r"\}"     
    } 
    pattern = '[%s]' % re.escape(''.join(rules.keys())) 
    new = re.sub(pattern, lambda m: rules[m.group()], h) 
    return new 

這樣你可以避免1)循環,2)更換已處理的內容。

+0

感謝哥們,我正在尋找這種類型的解決方案 – user196264097 2013-04-28 08:12:13

+0

我無法弄清楚什麼將輸入參數到lambda,以及將如何通過 – user196264097 2013-04-28 08:59:46

+0

@ user196264097:the參數是一個Match對象(http://docs.python.org/dev/library/re.html#re.sub) – georg 2013-04-28 09:01:38

1

您可以嘗試使用一個循環內應用re.sub在myarray.items迭代()。但是,您必須首先執行反斜槓,否則可能會錯誤地替換它們。您還需要確保「{」和「}」先發生,以免混淆匹配。因爲字典是無序的,我建議你使用的元組的列表,而不是:

def myfunc(h): 
    myarray = [ 
      ("\\","\\textbackslash") 
      ("{","\\{"), 
      ("}","\\}"), 
      ("#","\\#"), 
      ("$","\\$"), 
      ("%","\\%"), 
      ("&","\\&"), 
      ("~","\\~{}"), 
      ("_","\\_"), 
      ("^","\\^{}")] 

    for (val, replacement) in myarray: 
     h = re.sub(val, replacement, h) 
    h = re.sub("\\textbackslash", "\\textbackslash{}", h) 

    return h 
+1

我覺得'h.replace(val,replacement)'可能比're.sub(val,replacement,h)'快,並且適合我們的問題。 – Alexey 2013-04-28 07:49:21

+0

是的,我不太熟悉性能差異,但我認爲你的可讀性更強。 – 2013-04-28 07:52:01

+0

謝謝。只是好奇:是的,'str.replace'比're.sub'快。根據我的電腦測試6.7倍更快:) – Alexey 2013-04-28 08:03:52

0

逃跑元字符,請使用原始字符串和反斜線

r"regexp with a \* in it" 
1
  1. 我建議你使用原始文字語法(r"" )爲更好的代碼可讀性。
  2. 對於您的陣列的情況下,您可能只需使用str.replace函數而不是re.sub
def myfunc(h): 
    myarray = [ 
      ("\\", r"\textbackslash"), 
      ("{", r"\{"), 
      ("}", r"\}"), 
      ("#", r"\#"), 
      ("$", r"\$"), 
      ("%", r"\%"), 
      ("&", r"\&"), 
      ("~", r"\~{}"), 
      ("_", r"\_"), 
      ("^", r"\^{}")] 

    for (val, replacement) in myarray: 
     h = h.replace(val, replacement) 
    h = h.replace(r"\textbackslash", r"\textbackslash{}", h) 

    return h 

的代碼是@跳跳虎的回答修改。

相關問題