Python 查找一个由三个大写字母环绕的小写字母
我有一个混合了大小写字母的字符串。我需要找到每个由3个大写字母组成的小写字母,并从字符串中提取它 例如,Python 查找一个由三个大写字母环绕的小写字母,python,regex,string,Python,Regex,String,我有一个混合了大小写字母的字符串。我需要找到每个由3个大写字母组成的小写字母,并从字符串中提取它 例如,zzzazz我想提取前一个字符串中的a 我写了一个脚本,可以提取zzzazz,但不能单独提取a。我知道我需要使用嵌套的正则表达式来实现这一点,但我不能集中精力去实现它。以下是我所拥有的: import string, re
zzzazz
我想提取前一个字符串中的a
我写了一个脚本,可以提取zzzazz
,但不能单独提取a
。我知道我需要使用嵌套的正则表达式来实现这一点,但我不能集中精力去实现它。以下是我所拥有的:
import string, re
if __name__ == "__main__":
#open the file
eqfile = open("string.txt")
gibberish = eqfile.read()
eqfile.close()
r = re.compile("[A-Z]{3}[a-z][A-Z]{3}")
print r.findall(gibberish)
编辑:
谢谢你们的回答,伙计们!我想我应该说得更具体些。我需要找到由三个完全相同的大写字母包围的小写字母,例如在我的示例中,zzazz
r=re.compile((?r=re.compile((?你太接近了!请阅读的.group
*方法。例如,如果你的脚本以
r = re.compile("(?<=[A-Z]{3})[a-z](?=[A-Z]{3})")
r = re.compile("[A-Z]{3}([a-z])[A-Z]{3}")
print r.match(gibberish).group(1)
然后在第一组中捕获所需的角色
要解决匹配重复字母的新约束,可以使用反向引用:
r = re.compile(r'([A-Z])\1{2}(?P<middle>[a-z])\1{3}')
m = r.match(gibberish)
if m is not None:
print m.group('middle')
r=re.compile(r'([A-Z])\1{2}(?P[A-Z])\1{3})
m=r.匹配(胡言乱语)
如果m不是无:
打印m.group('中间')
这看起来像:
匹配字母a-Z并记住它
匹配找到的第一个字母的两个匹配项
匹配小写字母并将其存储在名为middle
的组中
再匹配找到的第一个字母的三个连续实例
如果找到匹配项,则打印middle
组的值
太接近了!请阅读的.group
*方法。例如,如果您的脚本以
r = re.compile("[A-Z]{3}([a-z])[A-Z]{3}")
print r.match(gibberish).group(1)
然后在第一组中捕获所需的角色
要解决匹配重复字母的新约束,可以使用反向引用:
r = re.compile(r'([A-Z])\1{2}(?P<middle>[a-z])\1{3}')
m = r.match(gibberish)
if m is not None:
print m.group('middle')
r=re.compile(r'([A-Z])\1{2}(?P[A-Z])\1{3})
m=r.匹配(胡言乱语)
如果m不是无:
打印m.group('中间')
这看起来像:
匹配字母a-Z并记住它
匹配找到的第一个字母的两个匹配项
匹配小写字母并将其存储在名为middle
的组中
再匹配找到的第一个字母的三个连续实例
如果找到匹配项,则打印middle
组的值
您需要用括号捕获您感兴趣的字符串部分,然后用re.MatchObject#group
访问它:
r = re.compile("[A-Z]{3}([a-z])[A-Z]{3}")
m = r.match(gibberish)
if m:
print "Match! Middle letter was " + m.group(1)
else:
print "No match."
您需要用括号捕获您感兴趣的字符串部分,然后用re.MatchObject#group
访问它:
r = re.compile("[A-Z]{3}([a-z])[A-Z]{3}")
m = r.match(gibberish)
if m:
print "Match! Middle letter was " + m.group(1)
else:
print "No match."
这将无法匹配“aaabaabaaa”
中的两个小写字母。这将无法匹配“aaabaabaaa”
中的两个小写字母。这将无法匹配“aaabaabaaa”
中的两个小写字母。这将无法匹配中的两个小写字母
+1,但我认为您不需要同时使用“向前看”和“向后看”。任何一个单独使用都应该可以,另一个是正常的match@gnibbler,是的,但这样做的话,如果你做一个findall
或finditer
,你只需要返回一个列表,而不需要理解(?@MikeSamuel到目前为止,您的解决方案运行得最好,但我想我应该更具体一些。大写字母必须完全相同,如我在上面使用的示例ZZZaZZZ
+1,但我认为您不需要同时使用“向前看”和“向后看”。任何一个单独使用都应该与另一个正常使用match@gnibbl呃,是的,但这样做的话,如果你做一个findall
或finditer
你只需要返回一个列表,而不需要做理解(?@MikeSamuel到目前为止,您的解决方案是最有效的,但我想我应该更具体一些。大写字母必须完全相同,如我上面使用的示例zzzazz
。