亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么python返回以下內容?

為什么python返回以下內容?

慕田峪9158850 2022-06-02 15:09:47
p = re.compile('x*')print(p.search('abxd'))輸出:<re.Match object; span=(0, 0), match=''>p = re.compile('x+')print(p.search('abxd'))輸出:<re.Match object; span=(2, 3), match='x'>
查看完整描述

2 回答

?
溫溫醬

TA貢獻1752條經驗 獲得超4個贊

您看到的是 Python(更具體地說,是 Regex 模塊)返回一個 re.Mach object。這個對象有方法和類,你可以調用它們來得到你想要的結果。


例如,如果您只想將匹配作為字符串,則此代碼將打印它:


>>> expression = re.compile('.+')

>>> result = expression.search('abcd')

>>> print(result.group())

'abcd'

您當前的代碼(第一個示例)還包含一個與輸入字符串不匹配的表達式,這可能是一些混亂的根源。在我提供的示例中,我使用了.+,它將匹配任何字符零到無限次。Regex101.com在幫助創建 Regex 表達式和理解語法方面做得非常出色。


這是RegexMatch對象的文檔(您在當前代碼中得到的內容),具體來說,這里是該.group()方法的文檔。


快速說明:

您不需要在調用搜索函數之前編譯表達式(但是,這完全是個人喜好,但它更常用;在調用搜索函數之前編譯表達式是有正當理由的,但這超出了范圍回答這個問題)。以下兩個代碼塊將執行完全相同的操作:


expression = re.compile('.+')

print(expression.search('string'))

print(re.search(r'.+', 'string'))

在第二塊中,表達式是搜索函數中的第一個參數,r前面有a,表示它是一個正則表達式。


希望這可以幫助!


查看完整回答
反對 回復 2022-06-02
?
鳳凰求蠱

TA貢獻1825條經驗 獲得超4個贊

正如re.search() 的文檔所說:


掃描字符串尋找正則表達式模式產生匹配的第一個位置,并返回相應的匹配對象。如果字符串中沒有位置與模式匹配,則返回 None;請注意,這與在字符串中的某個點找到零長度匹配不同。


(強調我的)


您的第一個 RegExx*匹配零個或多個character x。在所有匹配項中,返回第一個匹配項。您的模式與字符串的開頭匹配,因為它是zero 'x's. <re.Match object; span=(0, 0), match=''>因此,您的比賽在位置 0 ( )開始和結束。


當您搜索時,x+這意味著一個或多個 character x。您的字符串中唯一x的位置是位置2(第三個字符,但我們從 0 開始計數)。它是一個字符長,所以它在位置 3 結束。因此你的 result <re.Match object; span=(2, 3), match='x'>。


如果您查看所有匹配項而不僅僅是第一個匹配項,您也會看到其他匹配項!你可以這樣做,例如使用re.findall()


例子:


>>> re.findall(r'x+', 'abxb')

['x']

>>> re.findall(r'x*', 'abxb')

['', '', 'x', '', '']

如您所見,匹配零個或多個意味著我們也匹配了字母之間所有不存在的字符!當與其他模式結合使用時,零或更多的這個特性會更有用,即如果我們想說一個字符或單詞在我們的匹配中是可選的。假設我們想要匹配所有b后跟零個或多個xes 的 s:


>>> re.findall(r'bx*', 'abxb')

['bx', 'b']


查看完整回答
反對 回復 2022-06-02
  • 2 回答
  • 0 關注
  • 161 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號