正则表达式无法正确匹配

时间:2014-09-27 20:53:31

标签: python regex

我正在处理一个python挑战问题,找到格式为xXXXxXXXx的文本块(低于大写,而不是所有X' s),如下所示:

jdskvSJNDfbSJneSfnJDKoJIWhsjnfakjn

我测试了以下RegEx,发现它与我在网站上寻找的内容(http://www.regexr.com/)正确匹配:

'([A-Z])([A-Z]){3}([A-Z])([A-Z]){3}([A-Z])'

但是,当我尝试将此表达式与文本块匹配时,它只返回整个字符串:

In [1]: import re

In [2]: example = 'jdskvSJNDfbSJneSfnJDKoJIWhsjnfakjn'

In [3]: expression = re.compile(r'([a-z])([A-Z]){3}([a-z])([A-Z]){3}([a-z])')

In [4]: found = expression.search(example)

In [5]: print found.string
jdskvSJNDfbSJneSfnJDKoJIWhsjnfakjn

有什么想法吗?我的表情不正确吗?此外,如果有更简单的方式来表示该表达式,请随时告诉我。我对RegEx相当新。

3 个答案:

答案 0 :(得分:1)

您需要返回匹配组而不是字符串属性。

>>> import re
>>> s = 'jdskvSJNDfbSJneSfnJDKoJIWhsjnfakjn'
>>> rgx = re.compile(r'[a-z][A-Z]{3}[a-z][A-Z]{3}[a-z]')
>>> found = rgx.search(s).group()
>>> print found
nJDKoJIWh

答案 1 :(得分:0)

string属性始终返回作为匹配项输入传递的字符串。这显然是documented

  

<强>字符串

     

传递给match()或search()的字符串。

问题与匹配无关,你只是从匹配对象中抓取错误的东西。使用match.group(0)(或match.group())。

答案 2 :(得分:0)

基于xXXXxXXXx如果你想要len 3的大写字母和更低的len 1,这就是你想要的:

([a-z])(([A-Z]){3}([a-z]))+

您也可以使用search

获取group()功能
print expression.search(example).group(0)