簡體   English   中英

Python中的正則表達式替換列表中的項目

[英]Regular Expression in Python to Replace Items in a List

這是我們在大學里做的一個練習。 我試圖在 txt 文件中獲取所有 k1-9 和 p1-9 字符串並更改它們,以便每個 k(n) = 1*n 和每個 p(n) = 0*n(即 p5= 00000,k3= 111,p2 = 00)。 我已設法將 k1-9 和 p1-9 收集到名為代碼的列表中,但我不知道如何進行。

import re

with open("suspicious_knitting.txt") as file:
    string = file.read()
    codes = re.findall("k[1-9]|p[1-9]" ,string)

打印代碼是這樣的:

['k1', 'p1', 'k1', 'p1', 'k1', 'p2', 'k1', 'p2', 'k1', 'p3', 'k1', 'p3', 'k1', 'p1', 'k2', 'p1', 'k2', 'p3', 'k1', 'p2', 'k2', 'p1', 'k2', 'p1', 'k1', 'p1', 'k1', 'p1', 'k2', 'p2', 'k3', 'p1', 'k1', 'p2', 'k1', 'p2', 'k2', 'p1', 'k1', 'p1', 'k1', 'p2', 'k1', 'p2', 'k1', 'p2', 'k2', 'p2', 'k5', 'p2', 'k3', 'p1', 'k1', 'p1', 'k1', 'p2', 'k3', 'p1', 'k2', 'p3']

你可以使用sub

import re

text = ' '.join(
    ['k1', 'p1', 'k1', 'p1', 'k1', 'p2', 'k1', 'p2', 'k1', 'p3', 'k1', 'p3', 'k1', 'p1', 'k2', 'p1', 'k2', 'p3',
     'k1', 'p2', 'k2', 'p1', 'k2', 'p1', 'k1', 'p1', 'k1', 'p1', 'k2', 'p2', 'k3', 'p1', 'k1', 'p2', 'k1', 'p2',
     'k2', 'p1', 'k1', 'p1', 'k1', 'p2', 'k1', 'p2', 'k1', 'p2', 'k2', 'p2', 'k5', 'p2', 'k3', 'p1', 'k1', 'p1',
     'k1', 'p2', 'k3', 'p1', 'k2', 'p3'])


def repl(match):
    return int(match.group(2)) * match.group(1)


result = re.sub('([kp])([1-9])', repl, text)
print(result)

輸出

k p k p k pp k pp k ppp k ppp k p kk p kk ppp k pp kk p kk p k p k p kk pp kkk p k pp k pp kk p k p k pp k pp k pp kk pp kkkkk pp kkk p k p k pp kkk p kk ppp

解釋

模式([kp])([1-9])匹配一個k或一個p后跟19之間的任何數字。 對於子部分,讓我們看一下文檔:

返回通過替換 repl 替換 string 中最左邊的不重疊模式出現的字符串。

事實證明, repl可以是一個接收匹配對象的函數 在這種情況下, repl將第二個匹配組(重復次數)強制轉換為 int 與第一個匹配組(字母 k 或 p)的乘法。

請注意,我在您的問題中使用空格連接的示例作為輸入。

這里有一個更經典的方法。 我繼續基於你的代碼,只是替換了代碼注釋中描述的值。

    import re

    with open("suspicious_knitting.txt") as file:
        string = file.read()
        codes = re.findall("k[1-9]|p[1-9]" ,string)

        for i in range(len(codes) - 1):
            letter = codes[i][0] # this will be k or p
            number = codes[i][1] # this is number after k/p
            if letter == 'k':
                codes[i] = letter + ('1' * int(number)) # for example, if variable number is 5, 1 will be repeated 5 times
            else:
                codes[i] = letter + ('0' * int(number))

        # now array codes contains desireable values :)

暫無
暫無

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

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