re.findall表現得很奇怪源字符串是:# Python 3.4.3s = r'abc123d, hello 3.1415926, this is my book'這是我的模式:pattern = r'-?[0-9]+(\\.[0-9]*)?|-?\\.[0-9]+'但是,re.search可以給我正確的結果:m = re.search(pattern, s)print(m) # output: <_sre.SRE_Match object; span=(3, 6), match='123'>re.findall 只是轉出一個空列表:L = re.findall(pattern, s)print(L) # output: ['', '', '']為什么不能re.findall給我預期的清單:['123', '3.1415926']
2 回答

HUX布斯
TA貢獻1876條經驗 獲得超6個贊
s = r'abc123d, hello 3.1415926, this is my book'print re.findall(r'-?[0-9]+(?:\.[0-9]*)?|-?\.[0-9]+',s)
escape
當你使用時,你不需要兩次raw mode
。
輸出:['123', '3.1415926']
返回類型也是一個列表。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貢獻1864條經驗 獲得超6個贊
這里有兩點需要注意:
re.findall
如果正則表達式模式中包含捕獲組,則返回捕獲的文本r'\\.'
模式中的部分匹配兩個連續的字符,\
以及除換行符之外的任何字符。
如果模式中存在一個或多個組,則返回組列表; 如果模式有多個組,這將是一個元組列表。結果中包含空匹配,除非它們觸及另一個匹配的開頭。
請注意,要使re.findall
返回只匹配值,通常可以
刪除多余的捕獲組(例如
(a(b)c)
- >abc
)將所有捕獲組轉換為非捕獲(即替換
(
為(?:
),除非有反向引用引用模式中的組值(請參閱下文)使用
re.finditer
代替([x.group() for x in re.finditer(pattern, s)]
)
在您的情況下,findall
返回所有已捕獲的文本,因為您\\
在r''
字符串文字中嘗試匹配文字\
。
要匹配數字,您需要使用
-?\d*\.?\d+
正則表達式匹配:
-?
- 可選的減號\d*
- 可選數字\.?
- 可選的小數分隔符\d+
- 1位或更多位數。
見演示
這是IDEONE演示:
import re s = r'abc123d, hello 3.1415926, this is my book'pattern = r'-?\d*\.?\d+'L = re.findall(pattern, s)print(L)
添加回答
舉報
0/150
提交
取消