我原来的问题因为重复而被关闭了。我不同意它是重复的,因为在正则表达式语法方面,这是一个不同的用例。我试图在下面澄清我的问题。
是否可以创建一个正则表达式,该正则表达式匹配字符串中的两个重复的连续字符(在本例中为小写字母),但如果字符串的任意一侧都是相同的字符,则不匹配该字符串的某个部分。e、 g.匹配'aa'
,但不匹配'aaa'
或'aaaa'
?
此外:
>
虽然我使用的是Python 3.10,但我试图在不使用外部模块提供的附加功能的情况下,使用“标准”正则表达式语法来确定这是否可行。例如,使用Python,这意味着使用标准库中的're'
模块的解决方案。
如果有3个或3个以上重复的连续字符,则如果序列号中其他地方有两个重复的连续字符,则字符串仍应匹配。e、 g匹配'aa'
,即使字符串中的其他位置存在'bbb'
。
如果两个重复的连续字符出现在字符串的开头或结尾,则字符串也应匹配。
我的例子是16个字符的字符串,如果一个特定的长度有区别的话。
ffumlmqwfcsyqpss
应与'ff'
或'ss'
匹配。
zztdcqdzdaazdjp
应与'zz'
,'dd'
,'aa'
匹配。
urrvucyrzzzooxhx
应匹配'rr'
或'oo'
,即使字符串中存在'zzz'
。
zettygjpcoedwyio
应与'tt'
匹配。
dtfkgggvqadhqbwb
不应与'ggg'
匹配。
rwgwbwzebsnjmtln
不应该匹配。
([a-z])\1
捕获重复字符,但当存在其他重复字符(如'aaa'
或'aaaa'
等)时,这也会匹配。
([a-z])\1(?!\1)
对第三个重复字符求反,但这只会将匹配项移到重复字符串的末尾。
消极的环顾来补偿一开始的比赛,但我认为我造成了某种循环,这种循环永远不会匹配。
>>>import re
>>>re.search(r'([a-z])\1(?!\1)', 'dtfkgggvqadhqbwb')
<re.Match object; span=(5, 7), match='gg'> # should not match as 'gg' ('[gg]g' or 'g[gg]')
>
如果同一个字符串中有重复的三元组等,蒂姆·比格莱森的解决方案不匹配重复对。
在相关的问题中,Cary Swoveland的解决方案不适用于字符串开头或结尾的重复对,或者匹配,即使字符串中没有重复对。
在链接问题中,第四只鸟的解不匹配字符串开头或结尾的重复对。
到目前为止,唯一有效的答案是Wiktor Stribiżew,但它使用外部“regex”模块的(*SKIP)
功能。使用“标准”正则表达式语法不可能实现解决方案吗?
在Pythonre
中,为该任务创建正确的正则表达式的主要问题是,在使用对捕获组的反向引用之前,需要定义捕获组,而负lookbehind通常放在捕获模式之前。还有,regex101。com Python测试选项并不总是反映re
库中的当前状态,当它在(?)中看到
\1
时,它会向用户发出这样的消息:“此令牌不能用于查找,因为它的宽度不固定或干扰模式匹配。”?
这里可以使用的模式是
(.)(?<!\1.)\1(?!\1)
请参阅正则表达式演示。
详细资料
(.)
-捕获组1:任何单个字符(如果re.使用DOTALL
,偶数换行符)
(?
请参阅Python测试:
import re
tests ={'ffumlmqwfcsyqpss': ['ff','ss'],
'zztdcqzqddaazdjp': ['zz','dd', 'aa'],
'urrvucyrzzzooxhx': ['rr','oo'],
'zettygjpcoedwyio': ['tt'],
'dtfkgggvqadhqbwb': [],
'rwgwbwzebsnjmtln': []
}
for test, answer in tests.items():
matches = [m.group() for m in re.finditer(r'(.)(?<!\1.)\1(?!\1)', test, re.DOTALL)]
if matches:
print(f"Matches found in '{test}': {matches}. Is the answer expected? {set(matches)==set(answer)}.")
else:
print(f"No match found in '{test}'. Is the answer expected? {set(matches)==set(answer)}.")
输出:
Matches found in 'ffumlmqwfcsyqpss': ['ff', 'ss']. Is the answer expected? True.
Matches found in 'zztdcqzqddaazdjp': ['zz', 'dd', 'aa']. Is the answer expected? True.
Matches found in 'urrvucyrzzzooxhx': ['rr', 'oo']. Is the answer expected? True.
Matches found in 'zettygjpcoedwyio': ['tt']. Is the answer expected? True.
No match found in 'dtfkgggvqadhqbwb'. Is the answer expected? True.
No match found in 'rwgwbwzebsnjmtln'. Is the answer expected? True.
您可以使用以下正则表达式模式:
^(?![a-z]*([a-z])\1{2,})[a-z]*([a-z])\2[a-z]*$
此模式表示要匹配:
^ start of the string
(?![a-z]*([a-z])\1{2,}) same letter does not occur 3 times or more
[a-z]* zero or more letters
([a-z]) capture a letter
\2 which is followed by the same letter
[a-z]* zero or more letters
$ end of the string
我需要使用通配符类型搜索筛选一组字符串,如下所示: 寻找应该匹配你好,但不是Helo 查找应该匹配"pant"和"想要"但不匹配"ant" 寻找应该匹配"吉普赛人"和"典型" 代表一个或多个字符。我不介意手写或基于正则表达式的搜索。有什么想法吗?典型的。NET方法的通配符匹配0或更多,但我需要1个或更多字符。我该怎么做?
我有一些xml文件,希望删除除特定字符串以外的所有内容。 StackOverflow上还有很多类似的问题,但都不适用于我的文件,在尝试了几个小时不同的正则表达式后,我想寻求帮助。 到目前为止,部分成功但并非完全成功的最接近的正则表达式是: xml文件的示例: 我使用regex101,因此可以将示例粘贴在那里,以了解为什么rex只能部分工作。简而言之,它与第一次出现的不匹配,但与第二次出现的匹配。我
问题内容: 我在用Python将字符串中的数字匹配时遇到麻烦。尽管应该明确匹配,但甚至不匹配 或仅匹配。我的监督在哪里? 问题答案: 阅读文档:http : //docs.python.org/2/library/re.html#re.match 如果在零个或多个字符 开头 的 字符串 您要使用(或)
我正在努力提高我的正则表达式技能。我做不了这个练习。 https://alf.nu/RegexGolf 您必须匹配没有连续相同字符的单词。为了清楚起见,我们应该避免像abba、baab、czzc这样的模式。 我看到的唯一方法是使用捕获组: 然后进行负面展望: 但在网站上,它不工作,因为它不匹配任何东西。 有什么建议吗?谢谢
问题内容: 我在尝试将我的javascript regex经验转移到Python时遇到了麻烦。 我只是想让它工作: …但是它打印无。如果我做: 它匹配…默认情况下是否匹配字符串的开头?当匹配时,如何使用结果? 我如何进行第一场比赛?是否有比python网站提供的文档更好的文档? 问题答案: 隐式添加到您的正则表达式的开头。换句话说,它仅在字符串的开头匹配。 将在所有位置重试。 一般来说,建议您在需
我有这个字符串和这些regexp: 我希望第一个正则表达式失败,而第二个应该匹配。尝试一下,我看到两者都匹配,但我不明白为什么。 这是第一个正则表达式:https://regex101.com/r/hBZK2h/1 这是第二个:https://regex101.com/r/TEZmP6/1 我必须创建一个正则表达式,该表达式与边界为HC-HMC的字符串背面完全匹配,但不能与字符串匹配。有什么提示吗