你可以使用
\bt(?:[a-z]*[a-df-z])?\b
\bt[a-z]*\b(?<!e)
为了完整起见,这里有一个正则表达式来匹配任何以西里尔字母 т 开头且不以西里尔字母 е 结尾的单词:
\bт[^\W\d_]*\b(?<!е)
请参阅regex demo #1、regex demo #2 和 Cyrillic regex demo。
如果需要不区分大小写的匹配,请添加re.I:
re.findall(r'\bt(?:[a-z]*[a-df-z])?\b', text, re.I)
还有关于单词边界的说明:如果单词可以粘贴到_ 或数字,请使用字母边界而不是单词边界:
r'(?<![a-z])t(?:[a-z]*[a-df-z])?(?![a-z])'
r'(?<![^\W\d_])т[^\W\d_]*(?![^\W\d_])(?<!е)' # Unicode letter boundaries
正则表达式详细信息
-
\b - 单词边界(字符串的开头或紧跟在字符之后的位置,而不是数字、字母、下划线)
-
(?<![a-z])((?<![^\W\d_]) 是一个支持 Unicode 的等价物)- 与前面没有字母的位置相匹配的否定后向查找
-
t - t 信
-
(?:[a-z]*[a-df-z])? - 一个可选的非捕获组,匹配 0 个或多个字母,然后是 e 以外的字母
-
\b - 字边界
-
(?![a-z])((?![^\W\d_]) 是一个支持 Unicode 的等价物)- 与未紧跟字母的位置相匹配的否定前瞻。
还有,
-
\bt[a-z]*\b(?<!e) 匹配单词边界、t、任何零个或多个小写 ASCII 字母(任何带有 re.I 的 ASCII 字母),然后单词边界标记单词的结尾,并且否定的向后查找 (?<!e) 匹配失败,如果词尾有e
-
[^\W\d_]* - 匹配零个或多个 Unicode 字母。
见a Python demo:
import re
text = r't, train => main,teene!'
cyr_text = r'таня тане работе'
print( re.findall(r'\bt(?:[a-z]*[a-df-z])?\b', text, re.I) )
# => ['t', 'train']
print( re.findall(r'\bt[a-z]*\b(?<!e)', text, re.I) )
# => ['t', 'train']
print( re.findall(r'\bт[^\W\d_]*\b(?<!е)', cyr_text, re.I) )
# => ['таня']
print( re.findall(r'(?<![^\W\d_])т[^\W\d_]*(?![^\W\d_])(?<!е)', cyr_text, re.I) )
# => ['таня']