python - 正则表达式中*的疑问
PHPz
PHPz 2017-04-18 09:53:18
0
7
415
import re
text = 'thenextnothingis123456'
print(re.search(r'(\d*)', text).group(0))

为什么这段代码不能匹配出数字?如果将d替换成w反倒可以匹配出所有字符?

PHPz
PHPz

学习是最好的投资!

全部回覆(7)
小葫芦

因為r'(d*)'中*的意義是匹配0個或多個,所以它可以不匹配任何字元。使用re.search,從字串開頭開始匹配,因為'thenextnothingis123456'第一個字元不是數字,無法匹配,但r'(d*)'可以不匹配任何字符,所以返回空字串。

而r'(d+)'要求匹配1到多個數字,用來匹配'thenextnothingis123456'時,發現第一個字符不是字母,它還會繼續嘗試第二個字符,直到字符1開始都是數字,所以匹配了"123456". 查看下面的輸出結果就可以明白。

>>> import re
>>> text = 'thenextnothingis123456'
>>> p = re.search(r'(\d*)', text)
>>> p.start()
0
>>> p.end()
0
>>> p.groups()
('',)
>>> p = re.search(r'(\d+)', text)
>>> p.start()
16
>>> p.end()
22
>>> p.groups()
('123456',)
刘奇

為什麼這段程式碼不能匹配出數字?

我覺得其實已經匹配出來了,就是0次的數字: 你的.group(0)沒有報nonetype錯誤說明匹配成功了啊

迷茫

正規表示式30分鐘入門教學

阿神
>>> print(re.search(r'(\d*)', "abcd1234").group(0))  ########11111111

>>> print(re.search(r'(\d*)', "1234abcd").group(0))
1234
>>> print(re.search(r'[a-z]*(\d*)', "abcd1234").group(1))
1234

>>> print(re.search(r'(\d{0})', "abcd1234").group(0))  #######2222222

>>> print(re.search(r'(\d+)', "abcd1234xxx4321").group(0))
1234
>>> print(re.search(r'(\d+)', "abcd1234xxx4321").group(1))   ####可见re.search第一次匹配成功后就不再接着匹配
1234
>>> print(re.search(r'(\d+)', "abcd1234xxx4321").group(2))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: no such group

11111111這一句之所以結果為空,是由於re.search用了#######2222222
黄舟

你試試d,另外*是表示0次或多次

Peter_Zhu

雷雷

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板