2014-09-27 63 views
0

我解决一个Python挑战问题找到的文本块在这样的大块格式XXXXXXXXX(下VS大写,不是所有X):正则表达式表达不匹配正确

jdskvSJNDfbSJneSfnJDKoJIWhsjnfakjn

我测试了以下正则表达式,并发现它正确地匹配我从本网站寻找的内容(http://www.regexr.com/):

'([az])([AZ]){3}([az])([AZ ]){3}([az])'

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

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

文本夹头没有匹配的子字符串。 – hwnd 2014-09-27 20:55:26

+0

你在哪些文本上运行它?如果你在你给的例子(uBRrJZ ...)上运行它,那么你会得到None,因为hwnd说这个字符串中没有类似的组。 – BrenBarn 2014-09-27 20:56:34

+0

对,我知道我给的例子没有。全文长度为100,000个字符,所以我只贴了一个样本。应该只有一个匹配。刚刚编辑了一个不同的样本,确实有这种模式(nJDKoJIWh) – emilylinndb 2014-09-27 21:00:20

回答

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

工作!为什么返回.group()工作,但不是.string()? – emilylinndb 2014-09-27 21:12:21

0

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

传递到匹配的字符串()或搜索()。

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

0

基于xXXXxXXXx如果你想与LEN 3,下与他们这之间的长度1上字母是你想要什么:

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

你也可以得到你的search功能group()

print expression.search(example).group(0)