訂閱
糾錯(cuò)
加入自媒體

python的正則(二):一些高級用法

2020-07-14 17:11
ExASIC
關(guān)注

正則基礎(chǔ)請閱讀:

python的正則(一):簡單夠用的basic版

以下部分不學(xué)也問題不大,不用焦慮。

特殊字符

(?aiLmsux) 等價(jià)于re.A, re.I, re.L, re.M, re.S, re.U, re.X

(?:...) 不分組

(?aiLmsux-imsx:...) 去除少量模式

(?P<name>...) 給分組起個(gè)名字

(?P=name) 按名字引用

(?#...) 只是個(gè)注釋

(?=...) 后面包含

(?!...) 后面不包含

(?<=...) 前面包含

(?<。 前面不包含

(?(id/name)yes-pattern|no-pattern) yes pattern不滿足時(shí),再匹配no pattern

一些例子:

#1. 不區(qū)分大小寫

re.findall(r'(?i)abc', 'abcABCabc')  #['abc', 'ABC', 'abc']

等同于:

re.findall(r'abc', 'abcABCabc', re.I)

#2. 給分組起個(gè)名字,看起來比更容易閱讀

m = re.search(r'.(?P<port>w+)s*((?=port))', '.a(chǎn)bc (abc),')

print(m.group('port') # abc

print(m.group(0)) # .a(chǎn)bc (abc)

#3. 向前看

m = re.search(r'(?<=inputswires)(?P<input>w+)', 'input wire abc')

print(m.group('input') # abc

#4. 正則不滿足時(shí),嘗試匹配另外一個(gè)正則

m = re.search(r'(output)?s+(?(1)reg|wire)s+(w+)', 'output reg abc')

print(m.group(2)) # abc

m = re.search(r'(output)?s+(?(1)reg|wire)s+(w+)', 'input wire abc')

print(m.group(2)) # abcre的幾個(gè)函數(shù)re.escape

re.escape(pattern),自動(dòng)把特殊字符轉(zhuǎn)義。

print(re.escape('[7:0]')) # [7:0]re.compile

re.compile(pattern, flags=0),正則編譯,一次編譯可以多處使用,加快正則執(zhí)行速度。

re.finditer

re.finditer(pattern, string, flags=0),返回iterator,就是可以用for循環(huán)依次處理的數(shù)據(jù)類型,還可以獲得每個(gè)匹配字符串的開始start()和結(jié)束end()位置。例如,

s = """

input wire a,

input wire b,

output wire c,

output wire d

"""

m = re.finditer(r'(?:input|output)s+wires+(w+)', s)

for i in m:

print("start=", i.start(), "end=", i.end(), "match=", i.group(1))

# start= 1 end= 13 match= a

# start= 15 end= 27 match= b

# start= 29 end= 42 match= c

# start= 44 end= 57 match= dre.sub處理復(fù)雜的查找替換

re.sub(pattern, repl, string, count=0, flags=0) 的repl不僅僅可以是字符串,也可以是一個(gè)函數(shù)。例如,下面是一個(gè)改變端口順序的正則例子,

s = """

module test

(a, b, c, d, e);

//...

endmodule

"""

def rep(m):

# 獲取待處理的字符串

s1 = m.group(0)

# 一大堆復(fù)雜的處理

port = re.search(r'((.*))', s1).group(1)

port = port.strip()

port = re.sub('s+', "", port)

port_list = port.split(',')

port_list = port_list[::-1];

s2 = re.sub(r'(?<=().*(?=))', ','.join(port_list), s1)

# 返回處理完的字符串,用于替換

return s2

s3 = re.sub(r'module.*?;', rep, 0, re.S)

print(s3)

#module test

#  (e,d,c,b,a);

#  //...

#endmodule

聲明: 本文由入駐維科號的作者撰寫,觀點(diǎn)僅代表作者本人,不代表OFweek立場。如有侵權(quán)或其他問題,請聯(lián)系舉報(bào)。

發(fā)表評論

0條評論,0人參與

請輸入評論內(nèi)容...

請輸入評論/評論長度6~500個(gè)字

您提交的評論過于頻繁,請輸入驗(yàn)證碼繼續(xù)

  • 看不清,點(diǎn)擊換一張  刷新

暫無評論

暫無評論

人工智能 獵頭職位 更多
掃碼關(guān)注公眾號
OFweek人工智能網(wǎng)
獲取更多精彩內(nèi)容
文章糾錯(cuò)
x
*文字標(biāo)題:
*糾錯(cuò)內(nèi)容:
聯(lián)系郵箱:
*驗(yàn) 證 碼:

粵公網(wǎng)安備 44030502002758號