以 t 开头但以非 e 结尾的单词
A word starting with t but ends with other than e
我正在尝试创建一个以 t 或 T 开头但不以 e 字母结尾的正则表达式。到目前为止,我尝试了下面的代码,但没有给我想要的结果。谁能告诉我这里究竟缺少什么?
my_str = my_file.read()
word = re.findall("[tT].*[^e]$", my_str)
print(word)
你可以使用
\bt(?:[a-z]*[a-df-z])?\b
\bt[a-z]*\b(?<!e)
为了完整起见,这里有一个正则表达式来匹配任何以西里尔字母 т
开头且不以西里尔字母 е
结尾的单词:
\bт[^\W\d_]*\b(?<!е)
参见regex demo #1, regex demo #2 and a 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 字母。
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) )
# => ['таня']
也许:
[\W]([Tt]\w*[^e])[\W]
任何非单词字符后跟(捕获:Tt,一些可选的单词字符,不是e)后跟第一个非单词字符
还有一种方法:
re.findall(r"\b[Tt]+[a-zA-Z]*[^Ee\s]\b", my_str)
我正在尝试创建一个以 t 或 T 开头但不以 e 字母结尾的正则表达式。到目前为止,我尝试了下面的代码,但没有给我想要的结果。谁能告诉我这里究竟缺少什么?
my_str = my_file.read()
word = re.findall("[tT].*[^e]$", my_str)
print(word)
你可以使用
\bt(?:[a-z]*[a-df-z])?\b
\bt[a-z]*\b(?<!e)
为了完整起见,这里有一个正则表达式来匹配任何以西里尔字母 т
开头且不以西里尔字母 е
结尾的单词:
\bт[^\W\d_]*\b(?<!е)
参见regex demo #1, regex demo #2 and a 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 字母),然后单词边界标记单词的结尾如果单词 的末尾有 [^\W\d_]*
- 匹配零个或多个 Unicode 字母。
e
,则负向后看 (?<!e)
无法匹配
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) )
# => ['таня']
也许:
[\W]([Tt]\w*[^e])[\W]
任何非单词字符后跟(捕获:Tt,一些可选的单词字符,不是e)后跟第一个非单词字符
还有一种方法:
re.findall(r"\b[Tt]+[a-zA-Z]*[^Ee\s]\b", my_str)