Python使用正则表达式来查找子字符串的起始位置

时间:2013-09-07 08:53:15

标签: python regex python-2.7

我需要在字符串中找到子字符串的位置。

子字符串是字符“,0 *”,后跟两个字符为[0-9]或[A-F] 即。

kdjrnnj,0*B3;,w0l44
       ^^^^^
qui8ecc),0*21qxxcd4))
        ^^^^^

子字符串的长度始终为5个字符。在子字符串之前总是有一些数字(墨水)字符。子串之后可能有也可能没有字符。

我想使用re.something来查找字符串中子字符串的起始位置。 我的正则表达式知识很差 - 如果有人能告诉我如何做到这一点你就可以节省我几个小时的黑客攻击。

由于

4 个答案:

答案 0 :(得分:2)

使用match objectstart()方法:

>>> 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

答案 1 :(得分:0)

Python re.search()在匹配时返回MatchObject() instance,它包含.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()调用将从输入字符串中删除匹配的内容。

演示:

>>> 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之后的所有内容现在都已消失。

答案 2 :(得分:0)

正则表达式应该非常简单:.*,0\*[0-9A-F]{2}

答案 3 :(得分:0)

使用re.search()

re.search(r',0*[0-9A-F][0-9A-F]', your_string).start()