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

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

Python 正則表達式 - 任何子字符串匹配

Python 正則表達式 - 任何子字符串匹配

慕村9548890 2021-08-14 17:52:11
我想在格式18-05-2018 和中 查找日期18-05-18,但不是 2018-05-18。我想使用正則表達式,以便True在字符串中出現這樣的日期時得到。所以它應該返回True這些字符串:ggggg18-05-2018gggggggggg18-05-2018ggggg12345678ggggg18-05-18gggggggggg18-05-18ggggg12345678但它應該返回False這些字符串:ggggg2018-05-18gggggggggg2018-05-18ggggg12345678怎么做?我找到了findall()方法和模式,'\d{1,2}[-]\d{1,2}[-]\d{2,4}'但它返回True了最后兩個字符串,正如它18-05-18在其中找到的那樣。
查看完整描述

3 回答

?
肥皂起泡泡

TA貢獻1829條經驗 獲得超6個贊

使用負向后視和前視:


import re


s = 'sasdassdsadasdadas18-05-2018sdaq1213211214142'


print(re.findall(r'(?<!\d)\d{1,2}[-]\d{1,2}[-]\d{2,4}(?!\d)', s))

# ['18-05-2018']

這可確保在所需內容的開頭或結尾沒有尾隨數字。


為了證明它處理您的錯誤情況:


import re


s = 'sasdassdsadasdadas2018-05-2018sdaq1213211214142'


print(re.findall(r'(?<!\d)\d{1,2}[-]\d{1,2}[-]\d{2,4}(?!\d)', s))

# []


查看完整回答
反對 回復 2021-08-14
?
阿晨1998

TA貢獻2037條經驗 獲得超6個贊

一種方法是檢查日期匹配開始之前的內容是否是輸入開頭的非數字,日期匹配之后的內容也是非數字或輸入的結尾。


text = "sasdassdsadasdadas18-05-2018sdaq1213211214142"

matches = re.findall(r'(?:\D|^)(\d{1,2}[-]\d{1,2}[-]\d{2,4})(?:\D|$)', text)

print matches


['18-05-2018']


查看完整回答
反對 回復 2021-08-14
?
白豬掌柜的

TA貢獻1893條經驗 獲得超10個贊

您可以使用負后視和負前瞻來斷言左側和右側沒有數字。要匹配最后的 2 或 4 位數字,您可以使用交替:


(?<!\d)\d{2}-\d{2}-(?:\d{4}|\d{2})(?!\d)


正則表達式演示

import re

str = 'ggggg18-05-2018ggggg12345678'

print(re.findall(r'(?<!\d)\d{2}-\d{2}-(?:\d{4}|\d{2})(?!\d)', str))

請注意,您可以在沒有字符類的情況下使用連字符。


演示 Python


查看完整回答
反對 回復 2021-08-14
  • 3 回答
  • 0 關注
  • 274 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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