【问题标题】:How to find a repeated letter in a string with Regular Expressions - Python3 [duplicate]如何使用正则表达式在字符串中查找重复的字母 - Python3 [重复]
【发布时间】:2020-09-12 01:09:37
【问题描述】:

我尝试了很多不同的方法,但我无法做到这一点。我需要用正则表达式捕获两个不同的字符串(我在 Py3 上使用 RE)。

  1. 我需要将同一个字母的子串重复 3 次
  2. 我需要取一个 XYX 的子字符串,例如“BAB”或“ACA”(我什至不知道如何开始)

opções = "abc aab aaa acb acvd ccd bb bbb dsa dssd ssss" #the string 

regular = re.compile('([a-z])\3') #I need to find "aaa", "bbb" and etc., but not "sss" or "bb"

print(regular)
print(re.findall(regular, opções))```


【问题讨论】:

  • 你在找\b([a-z])\1\1\b
  • 我试过了,但没有成功。它返回“[]”作为输出:/
  • ' aaab '' abbb ' 匹配吗?

标签: python regex string python-re


【解决方案1】:

问题

你有几个问题:

  1. 您的正则表达式 ([a-z])\3 捕获单个小写字母字符,然后尝试匹配捕获组 3(不存在)
  2. 您使用re.findall(regular, string),但您已经将正则表达式编译为regular,因此您应该将其称为regular.findall(string)
  3. 您将正则表达式用单引号括起来(很好)',但您的正则表达式包含反斜杠。要逃避它,您需要使用r''

解决方案

解决以上所有问题,我们得到以下结果。

finditer方法

See code working here

import re

s = "abc aab aaa acb acvd ccd bb bbb dsa dssd ssss"
r = re.compile(r'\b([a-z])\1\1\b')

print([i[0] for i in r.finditer(s)])

正则表达式的工作原理是确保单词 \b 周围的单词边界,以便我们精确匹配 3 次重复而不是更多(正如您的问题所指定 - 匹配 bbb 但不匹配 ssss 中的 sss)。

列表推导循环遍历finditer 的结果,只为我们提供每个匹配项中的第一个元素(否则我们会为每个元素('aaa', 'a') 得到一个看起来像这样的列表)。

findall方法

See code working here

import re

s = "abc aab aaa acb acvd ccd bb bbb dsa dssd ssss"
r = re.compile(r'\b(([a-z])\2\2)\b')

print([i[0] for i in r.findall(s)])

【讨论】:

  • 哇,工作真的很棒!谢谢 :) 但是,使用相同的逻辑我不能继续下一部分。我试过了:r'\b([a-z])(?!\1)\1\b PS:我在字符串中放了一个“aba”用于测试哈哈哈 PSS:我还尝试了一些不同的选项,如\b(\w)\1(?!\1)\1\b
  • @ViniciusRochaPerrud 负前瞻不消耗字符,所以你在(?!\1)\1 有一个矛盾的正则表达式模式(下一个字符不能是我们刚刚捕获的;移动到下一个字符 -> 它必须成为我们捕获的东西)。这就像说if x!=1 && x==1(总是false)。你可能想要\b(\w)(?!\1)\w\1\b
  • 我不知道你是什么。但对我来说,它是一个天使!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-26
  • 2016-07-29
  • 2022-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-05
相关资源
最近更新 更多