- 此问题在此处已有答案**:
Regular expression for repeating sequence(8个答案)
2天前关闭。
我的问题是,在使用正则表达式时,我可以重复感兴趣的模式吗?例如,我在文件中查找单词(每行只是一个单词,这样更容易)只包含辅音和元音,这种情况可以发生很多次。这意味着"banana"是允许的,但"bananas","banaana","bananna"等不允许。"ba"也是允许的,"bana"也是如此,等等。我想重复的基本模式是:
[bcdfghjklmnpqrstvwxyz]{1}[aeiouy]{1}
我所做的是这样的(图案和上面的一样,只是用了希腊字母)
import re
def f(x):
res_count = 0
regex_list = ['^[βγδζθκλμνξπρστφχψ]{1}[αεηιουω]{1}$',
'^[βγδζθκλμνξπρστφχψ]{1}[αεηιουω]{1}[βγδζθκλμνξπρστφχψ]{1}[αεηιουω]{1}$',
'^[βγδζθκλμνξπρστφχψ]{1}[αεηιουω]{1}[βγδζθκλμνξπρστφχψ]{1}[αεηιουω]{1}[βγδζθκλμνξπρστφχψ]{1}[αεηιουω]{1}$',
'^[βγδζθκλμνξπρστφχψ]{1}[αεηιουω]{1}[βγδζθκλμνξπρστφχψ]{1}[αεηιουω]{1}[βγδζθκλμνξπρστφχψ]{1}[αεηιουω]{1}[βγδζθκλμνξπρστφχψ]{1}[αεηιουω]{1}$',
'^[βγδζθκλμνξπρστφχψ]{1}[αεηιουω]{1}[βγδζθκλμνξπρστφχψ]{1}[αεηιουω]{1}[βγδζθκλμνξπρστφχψ]{1}[αεηιουω]{1}[βγδζθκλμνξπρστφχψ]{1}[αεηιουω]{1}[βγδζθκλμνξπρστφχψ]{1}[αεηιουω]{1}$',
'^[βγδζθκλμνξπρστφχψ]{1}[αεηιουω]{1}[βγδζθκλμνξπρστφχψ]{1}[αεηιουω]{1}[βγδζθκλμνξπρστφχψ]{1}[αεηιουω]{1}[βγδζθκλμνξπρστφχψ]{1}[αεηιουω]{1}[βγδζθκλμνξπρστφχψ]{1}[αεηιουω]{1}[βγδζθκλμνξπρστφχψ]{1}[αεηιουω]{1}$',
'^[βγδζθκλμνξπρστφχψ]{1}[αεηιουω]{1}[βγδζθκλμνξπρστφχψ]{1}[αεηιουω]{1}[βγδζθκλμνξπρστφχψ]{1}[αεηιουω]{1}[βγδζθκλμνξπρστφχψ]{1}[αεηιουω]{1}[βγδζθκλμνξπρστφχψ]{1}[αεηιουω]{1}[βγδζθκλμνξπρστφχψ]{1}[αεηιουω]{1}[βγδζθκλμνξπρστφχψ]{1}[αεηιουω]{1}$',
'^[βγδζθκλμνξπρστφχψ]{1}[αεηιουω]{1}[βγδζθκλμνξπρστφχψ]{1}[αεηιουω]{1}[βγδζθκλμνξπρστφχψ]{1}[αεηιουω]{1}[βγδζθκλμνξπρστφχψ]{1}[αεηιουω]{1}[βγδζθκλμνξπρστφχψ]{1}[αεηιουω]{1}[βγδζθκλμνξπρστφχψ]{1}[αεηιουω]{1}[βγδζθκλμνξπρστφχψ]{1}[αεηιουω]{1}[βγδζθκλμνξπρστφχψ]{1}[αεηιουω]{1}$',
'^[βγδζθκλμνξπρστφχψ]{1}[αεηιουω]{1}[βγδζθκλμνξπρστφχψ]{1}[αεηιουω]{1}[βγδζθκλμνξπρστφχψ]{1}[αεηιουω]{1}[βγδζθκλμνξπρστφχψ]{1}[αεηιουω]{1}[βγδζθκλμνξπρστφχψ]{1}[αεηιουω]{1}[βγδζθκλμνξπρστφχψ]{1}[αεηιουω]{1}[βγδζθκλμνξπρστφχψ]{1}[αεηιουω]{1}[βγδζθκλμνξπρστφχψ]{1}[αεηιουω]{1}[βγδζθκλμνξπρστφχψ]{1}[αεηιουω]{1}$',
]
with open(x) as greek_words:
for words in greek_words:
for w_pat in regex_list:
result = re.findall(w_pat,words)
if result:
res_count += 1
corrected = str(result).strip('[]\'')
with open('easy_words_for_children.txt', 'a') as g:
g.write(f'{corrected}\n')
result = False
return res_count
f('words_greek_normalized.txt')
所以我只是手动重复预期的模式,但我想看看是否有另一种方法来获得相同的输出。其余的只是把结果写入另一个文件。
2条答案
按热度按时间vnjpjtjt1#
你只是想重复一个模式,所以这是可行的:
输出:
因此,只需将需要重复的匹配文本 Package 在
(?:..)+
中。+
表示"一次或多次",括号只是将重复的内容分组,而?:
表示您对分组感兴趣,但不想单独捕获分组部分-您只想匹配整个内容。请注意,您不需要
{1}
-默认情况下只匹配它一次,除非您告诉regex引擎其他情况。ercv8c1e2#
从头到尾找出一个辅音和一个元音,重复一次或多次。
对于希腊语,请使用
r'\A(?:[βγδζθκλμνξπρστφχψ][αεηιουω])+\Z'
。或者允许有一个可选的尾随辅音: