Python:将f-string与r-string和正则表达式中的花括号组合

3

给定一个单词(x),返回在该单词中可能出现的n-gram。 你可以根据需要修改n-gram的值,它在pat变量中用花括号表示。 默认的n-gram值为4。

例如,对于单词(x):

x = 'abcdef'

可能的4-gram为:

['abcd', 'bcde', 'cdef']

def ngram_finder(x):
    pat = r'(?=(\S{4}))'
    xx = re.findall(pat, x)
    return xx

问题是:如何在正则表达式中使用花括号将f-string和r-string组合起来。
1个回答

7
您可以使用此字符串将n值合并到您的正则表达式中,并使用双大括号创建输出中的单个大括号:
fr'(?=(\S{{{n}}}))'

正则表达式需要使用 {} 来表示量词(就像你在原始正则表达式中所做的那样,{4})。然而,f-strings使用 {} 来表示表达式替换,因此你需要在 f-string 中“转义”正则表达式所需的 {}。这可以通过使用 {{}} 来完成,在输出中会生成 {}。因此,{{{n}}}(其中 n=4)会生成所需的 '{' + '4' + '}' = '{4}'
完整代码:
import re

def ngram_finder(x, n):
    pat = fr'(?=(\S{{{n}}}))'
    return re.findall(pat, x)
    
x = 'abcdef'
print(ngram_finder(x, 4))
print(ngram_finder(x, 5))

输出:

['abcd', 'bcde', 'cdef']
['abcde', 'bcdef']

谢谢,你的解决方案完美地解决了问题;可以问一下这里三个大括号的逻辑是什么?我不太明白,虽然它确实有效! - Akbar Hussein
1
@AkbarHussein 正则表达式需要有 {} 来表示量词(就像你原来的正则表达式中使用了 {4})。f 字符串使用 {} 来表示表达式替换,因此你需要在 f 字符串中“转义”正则表达式所需的 {}。这可以通过使用 {{}} 来实现,在输出中它们会生成 {}。因此,{{{n}}} 会生成 '{' + '4' + '}' = '{4}',如所需。 - Nick
这是一种很好的技巧,当你想将模式嵌入到其他模式中时使用(并且不太使用花括号的正则表达式形式)。请注意,通常在将固定字符串嵌入到模式中之前,应该通过 re.escape 将其转义,否则字符串中的某些字符可能会被错误地解释为正则表达式元字符。 - rjh
@rjh 你说得完全正确;不过在这种情况下,n只能是一个数字,所以不需要转义。 - Nick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接