python - 是否有正则表达式模式,它返回相同字符的所有完全匹配?
问题描述
我想使用正则表达式来查找最长的重复字母组合或重复字母列表。
在这里,我已经找到了一个模式 ('(?=(.))\1{2,}') 来解决这个问题。当我使用搜索功能时,它会返回我的第一个匹配项。如果我使用 findall,期望得到所有匹配项的列表,我会得到一个符号列表,其中每个符号的长度等于 1。
import re
from Typing import List
def long_repeat(string: str) -> List[int]:
pattern = re.compile(r'(?=(.))\1{2,}')
counts = pattern.some_func(string)
return counts
long_repeat('ddvvrwwwrggg') -> ['dd', 'vv', 'r', 'www', 'r','ggg']
long_repeat('iiaaggg') -> ['ii', 'aa', 'ggg']
long_repeat('abc') -> ['a', 'b', 'c']
解决方案
也许是这样的:
import re
from typing import List
_RGX = re.compile(r'(.)\1*')
def long_repeat(string: str) -> List[str]:
return [m.group(0) for m in _RGX.finditer(string)]
print(long_repeat('ddvvrwwwrggg'))
# ['dd', 'vv', 'r', 'www', 'r', 'ggg']
print(long_repeat('iiaaggg'))
# ['ii', 'aa', 'ggg']
print(long_repeat('abc'))
# ['a', 'b', 'c']
或者,如果您只想要最长的,具有词典优先级:
import re
_RGX = re.compile(r'(.)\1*')
def longest_repeat(string: str) -> int:
return min((m.group(0) for m in _RGX.finditer(string)), key=lambda s: (-len(s), s))
print(longest_repeat('ddvvrwwwrggg'))
# ggg
print(longest_repeat('iiaaggg'))
# ggg
print(longest_repeat('abc'))
# a
推荐阅读
- django - Django - 为 formd.MultipleChoiceField 设置初始选定值
- r - 在 R 中加载包 RcmrdMisc 和 tidyverse 时出错
- javascript - Javascript Uncaught TypeError:value.toUpperCase 不是函数
- java - 如何从类对象列表中提取值,删除重复项并按字母顺序排序?
- javascript - react.js 处理多个复选框字段
- python - 如何循环检索 div-id
- api - GitHub REST API:从多个问题中高效地获取评论列表
- javascript - 两个日期的差异显示 6 天太多了
- javascript - 将道具传递给模态传递每个对象
- html - flex中的换行符