簡體   English   中英

Python使用正則表達式來查找子字符串的起始位置

[英]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.searchre.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM