簡體   English   中英

如何在python中通過正則表達式替換/修改模式?

[英]How to replace/modify a pattern by regular expression in python?

假設我想修改腳本中的所有模式,以一行為例:

line = "assert Solution().oddEvenList(genNode([2,1,3,5,6,4,7])) == genNode([2,3,6,7,1,5,4]), 'Example 2'"

請注意,函數genNodeList[int]作為參數。 我想要的是刪除List,並保持列表中的所有整數,以便該函數實際上將*nums作為參數。

期待:

line = "assert Solution().oddEvenList(genNode(2,1,3,5,6,4,7)) == genNode(2,3,6,7,1,5,4), 'Example 2'"

我想出了一個re模式

r"([g][e][n][N][o][d][e][(])([[][0-9\,\s]*[]])([)])"

但我不確定如何使用它...我無法讓re.sub工作,因為它需要我用固定的字符串替換。

我怎樣才能達到理想的效果?

你可以做:

re.sub(r'(genNode\()\[([^]]+)\]', r'\1\2', line)
  • (genNode\\()匹配genNode(並將其放入捕獲的組1中
  • \\[匹配文字[
  • ([^]]+)匹配到下一個] ,並將其放入捕獲的組2中
  • \\]匹配文字]

在替換中,我們僅使用捕獲的組,即丟棄[]


您可以通過使用零寬度正向lookbehind來匹配第一個捕獲的組,以匹配[ :之前的部分:

re.sub(r'(?<=genNode\()\[([^]]+)\]', r'\1', line)

例:

In [444]: line = "assert Solution().oddEvenList(genNode([2,1,3,5,6,4,7])) == genNode([2,3,6,7,1,5,4]), 'Example 2'"                                                                                         

In [445]: re.sub(r'(genNode\()\[([^]]+)\]', r'\1\2', line)                                                                                                                                                  
Out[445]: "assert Solution().oddEvenList(genNode(2,1,3,5,6,4,7)) == genNode(2,3,6,7,1,5,4), 'Example 2'"

In [446]: re.sub(r'(?<=genNode\()\[([^]]+)\]', r'\1', line)                                                                                                                                                 
Out[446]: "assert Solution().oddEvenList(genNode(2,1,3,5,6,4,7)) == genNode(2,3,6,7,1,5,4), 'Example 2'"

FWIW,使用典型的非貪婪模式.*? 而不是[^]]+也會起作用:

re.sub(r'(?<=genNode\()\[(.*?)\]', r'\1', line)

而不是寫[g][e][n][N][o][d][e][(]你可以寫getNode\\(

您使用的當前字符類[0-9\\,\\s]*匹配列出的任何列表的0+次,例如也可以僅匹配逗號,並且不確保存在逗號分隔的數字。

要匹配逗號分隔符整數,您可以將1+位與重復組匹配以匹配逗號和1+位。

最后使用正向前瞻來斷言右括號或在第3組中捕獲它並在替換中使用它。

使用此模式使用r'\\1\\2作為替換。

(genNode\()\[(\d+(?:,\d+)*)\](?=\))

說明

  • (genNode\\()捕獲第1組匹配genNode(
  • \\[匹配[
  • (捕獲第2組
    • \\d+(?:,\\d+)*匹配1+位數並重復0次以上逗號和1位數字(也支持單個數字)
  • )關閉第2組
  • \\]比賽]
  • (?=\\))正向前瞻,斷言右邊的是一個右括號)

Python演示 | 正則表達式演示

例如

import re

regex = r"(genNode\()\[(\d+(?:,\d+)*)\](?=\))"
line = "assert Solution().oddEvenList(genNode([2,1,3,5,6,4,7])) == genNode([2,3,6,7,1,5,4]), 'Example 2'"
result = re.sub(regex, r"\1\2", line)

if result:
    print (result)

結果

assert Solution().oddEvenList(genNode(2,1,3,5,6,4,7)) == genNode(2,3,6,7,1,5,4), 'Example 2'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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