[英]Python using a regex to find start position of a substring
我需要在字符串中找到子字符串的位置。
子字符串是字符“,0 *”,后跟兩個字符,即[0-9]或[AF]即
kdjrnnj,0*B3;,w0l44
^^^^^
qui8ecc),0*21qxxcd4))
^^^^^
子字符串的長度始終為5個字符。 在子字符串之前總是有一些數字(墨水)字符。 子字符串后面可能有也可能沒有字符。
我想使用re.something來查找字符串中子字符串的起始位置。 我的正則表達式知識很差 - 如果有人能告訴我如何做到這一點,你就可以節省我幾個小時的黑客行為。
謝謝
使用match對象的start()
方法:
>>> r = re.compile(r',0\*[0-9A-F]{2}')
>>> m = r.search("kdjrnnj,0*B3;,w0l44")
>>> if m : print m.start()
7
>>> m = r.search("qui8ecc),0*21qxxcd4))")
>>> if m : print m.start()
8
下一步是刪除子字符串后的所有內容
你不需要索引,也可以用正則表達式完成:
>>> strs = "qui8ecc),0*21qxxcd4))"
>>> re.search(r'.*?,0\*[0-9A-F]{2}', strs).group()
'qui8ecc),0*21'
>>> m = r.search("kdjrnnj,0*B3;,w0l44")
>>> if m : print m.group()
kdjrnnj,0*B3
re.search
比re.sub
更快 :
>>> strs = 'kdjrnnj,0*B3;,w0l44'
>>> %timeit r.search(strs).group()
100000 loops, best of 3: 1.42 us per loop
>>> %timeit pattern.sub('', strs)
100000 loops, best of 3: 2.79 us per loop
>>> strs = 'kdjrnnj,0*B3;,w0l44'*1000
>>> %timeit r.search(strs).group()
100000 loops, best of 3: 1.43 us per loop
>>> %timeit pattern.sub('', strs)
10000 loops, best of 3: 59.9 us per loop
>>> strs = 'kdjrnnj'*1000 + ',0*B3;,w0l44'
>>> %timeit r.search(strs).group()
1000 loops, best of 3: 260 us per loop
>>> %timeit pattern.sub('', strs)
1000 loops, best of 3: 410 us per loop
Python re.search()
在匹配時返回一個MatchObject()
實例 ,它包含一個.start()
方法,為您提供匹配的位置:
import re
pattern = re.compile(r',0\*[0-9A-F]{2}')
match = pattern.search(inputstring)
if match:
print match.start()
注意\\*
雖然; 星號( *
)是正則表達式元字符,因此需要使用斜杠進行轉義以匹配文字*
。
[0-9A-F]
定義了一個與兩個命名范圍中的任何字符匹配的字符類,並且該類后面的{2}
將其限制為恰好匹配兩個字符。
演示:
>>> import re
>>> pattern = re.compile(r',0\*[0-9A-F]{2}')
>>> match = pattern.search('kdjrnnj,0*B3;,w0l44')
>>> match.start()
7
>>> match.group()
',0*B3'
>>> match = pattern.search('qui8ecc),0*21qxxcd4))')
>>> match.start()
8
>>> match.group()
',0*21'
如果您需要刪除此字符串后的所有內容,請使用re.sub()
代替:
pattern = re.compile(r'(?<=,0\*[0-9A-F]{2}).*')
newstring = pattern.sub('', oldstring)
這使用了一個后視斷言; 它會查找您的模式,然后匹配re.sub()
所有內容 ,然后re.sub()
調用將從輸入字符串中刪除匹配的內容。
演示:
>>> pattern = re.compile(r'(?<=,0\*[0-9A-F]{2}).*')
>>> pattern.sub('', 'kdjrnnj,0*B3;,w0l44')
'kdjrnnj,0*B3'
>>> pattern.sub('', 'qui8ecc),0*21qxxcd4))')
'qui8ecc),0*21'
注意,0*B3
和,0*21
內容現在都消失了。
這個的正則表達式應該非常簡單: .*,0\\*[0-9A-F]{2}
。
使用re.search()
:
re.search(r',0*[0-9A-F][0-9A-F]', your_string).start()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.