在python中使用regex查找重复模式[duplicate]

k4ymrczo  于 2023-01-06  发布在  Python
关注(0)|答案(2)|浏览(178)
    • 此问题在此处已有答案**:

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')

所以我只是手动重复预期的模式,但我想看看是否有另一种方法来获得相同的输出。其余的只是把结果写入另一个文件。

vnjpjtjt

vnjpjtjt1#

你只是想重复一个模式,所以这是可行的:

import re

# first two match, the rest don't
some_words = ['banana', 'cola', 'cocoa', 'hear', 'agape', 'letter']

# y is not technically a vowel, but that's not an issue here
expression = '^(?:[bcdfghjklmnpqrstvwxyz][aeiouy])+$'

for word in some_words:
    if re.match(expression, word):
        print(word)

输出:

banana
cola

因此,只需将需要重复的匹配文本 Package 在(?:..)+中。+表示"一次或多次",括号只是将重复的内容分组,而?:表示您对分组感兴趣,但不想单独捕获分组部分-您只想匹配整个内容。
请注意,您不需要{1}-默认情况下只匹配它一次,除非您告诉regex引擎其他情况。

ercv8c1e

ercv8c1e2#

从头到尾找出一个辅音和一个元音,重复一次或多次。

>>> s1 = "banana"
>>> s2 = "baanana"
>>> re.match(r'\A(?:[bcdefghjklmnpqrstvwxyz][aeiou])+\Z', s1)
<re.Match object; span=(0, 6), match='banana'>
>>> re.match(r'\A(?:[bcdefghjklmnpqrstvwxyz][aeiou])+\Z', s2)

对于希腊语,请使用r'\A(?:[βγδζθκλμνξπρστφχψ][αεηιουω])+\Z'
或者允许有一个可选的尾随辅音:

>>> cons = 'bcdefghjklmnpqrstvwxyz'
>>> vow = 'aeiou'
>>> re.match(rf'\A(?:[{cons}][{vow}])+[{cons}]?\Z', 'bananas')
<re.Match object; span=(0, 7), match='bananas'>

相关问题