这个正则表达式是否符合我的想法?

时间:2011-06-16 19:14:34

标签: python regex

我正在尝试进行Python挑战。我目前陷入问题#3。该问题为您提供了大量文本,并告诉您提取任何由3个大写字母包围的小写字母。例如:XXXsXXX应该返回s作为匹配。

我想出了这个正则表达式来执行寻找匹配。

message = re.findall('(?<=[A-Z]{3})[a-z](?=...[A-Z]{3})', data)

我认为这样做是:

  1. 在小写字母前查找3个大写字母。
  2. 在小写字母后面查找3个大写字母。
  3. 返回小写字母。
  4. 这是对的吗?

3 个答案:

答案 0 :(得分:3)

我不应该在不检查它们是否有效的情况下对功绩进行评论。我很傻。你的正则表达式不能像书面那样工作。你正在寻找这样的东西:

message = re.findall(r'[^A-Z][A-Z]{3}([a-z])[A-Z]{3}[^A-Z]', data)

会抓住你要找的那封信。

答案 1 :(得分:2)

你的正则表达式的问题是前瞻中的...,你基本上是在寻找任何三个字符后面跟着小写字母后面的三个大写字符。例如:

>>> re.findall('(?<=[A-Z]{3})[a-z](?=...[A-Z]{3})', "AAAb123CCC")
['b']
>>> re.findall('(?<=[A-Z]{3})[a-z](?=...[A-Z]{3})', "AAAbCCC")
[]

您可以通过删除前瞻中的三个...来解决此问题,但是如果您需要精确匹配三个大写或小写,则需要将正则表达式修改为如下所示:

(?<=[^A-Z][A-Z]{3})[a-z](?=[A-Z]{3}[^A-Z])

您可能需要处理以有效模式开头或结尾的字符串的特殊情况。

答案 2 :(得分:1)

该页面仅包含 字母。所以最简单的解决方案是查找侧面用小写字符的大写字母:

message = re.findall('[a-z][A-Z]{3}([a-z])[A-Z]{3}[a-z]', data)

前瞻和后视让你自己变得困难!