我正在处理一个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相当新。
答案 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)