2 回答

TA貢獻(xiàn)1876條經(jīng)驗(yàn) 獲得超6個(gè)贊
s = r'abc123d, hello 3.1415926, this is my book'print re.findall(r'-?[0-9]+(?:\.[0-9]*)?|-?\.[0-9]+',s)
escape
當(dāng)你使用時(shí),你不需要兩次raw mode
。
輸出:['123', '3.1415926']
返回類型也是一個(gè)列表。strings
如果你想要返回類型integers
和floats
使用map
import re,ast s = r'abc123d, hello 3.1415926, this is my book'print map(ast.literal_eval,re.findall(r'-?[0-9]+(?:\.[0-9]*)?|-?\.[0-9]+',s))
輸出: [123, 3.1415926]

TA貢獻(xiàn)1864條經(jīng)驗(yàn) 獲得超6個(gè)贊
這里有兩點(diǎn)需要注意:
re.findall
如果正則表達(dá)式模式中包含捕獲組,則返回捕獲的文本r'\\.'
模式中的部分匹配兩個(gè)連續(xù)的字符,\
以及除換行符之外的任何字符。
如果模式中存在一個(gè)或多個(gè)組,則返回組列表; 如果模式有多個(gè)組,這將是一個(gè)元組列表。結(jié)果中包含空匹配,除非它們觸及另一個(gè)匹配的開頭。
請(qǐng)注意,要使re.findall
返回只匹配值,通??梢?/p>
刪除多余的捕獲組(例如
(a(b)c)
- >abc
)將所有捕獲組轉(zhuǎn)換為非捕獲(即替換
(
為(?:
),除非有反向引用引用模式中的組值(請(qǐng)參閱下文)使用
re.finditer
代替([x.group() for x in re.finditer(pattern, s)]
)
在您的情況下,findall
返回所有已捕獲的文本,因?yàn)槟?code>\\在r''
字符串文字中嘗試匹配文字\
。
要匹配數(shù)字,您需要使用
-?\d*\.?\d+
正則表達(dá)式匹配:
-?
- 可選的減號(hào)\d*
- 可選數(shù)字\.?
- 可選的小數(shù)分隔符\d+
- 1位或更多位數(shù)。
見演示
這是IDEONE演示:
import re s = r'abc123d, hello 3.1415926, this is my book'pattern = r'-?\d*\.?\d+'L = re.findall(pattern, s)print(L)
添加回答
舉報(bào)