python - 以 t 开头但以非 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)
为了完整起见,这里有一个正则表达式来匹配任何以 Cyrillic 开头т
且不以 Cyrillic 结尾的单词е
:
\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 字母(任何带有 的 ASCII 字母re.I
),然后单词边界标记单词的结尾,如果单词末尾有,则否定的lookbehind失败(?<!e)
匹配e
[^\W\d_]*
- 匹配零个或多个 Unicode 字母。
查看Python 演示:
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) )
# => ['таня']
推荐阅读
- javascript - 如何将 Vue 挂载函数与外部依赖项同步?
- javascript - 将数组中的项目添加到另一个数组中的对象中
- java - 将 ActorRef 获取到先前生成的 EventSourcedBehavior
- android - 如何在 Android 上将预填充的 SQLite DB 与 Expo 一起使用?
- excel - 如何使用 VBA 单击 HTML 链接
- d3.js - D3 圆形包装在 angular9 中不起作用
- snmp - snmp 将 Gauge32 转换为整数的问题
- kotlin - Kotlin - 委托作为函数参数(匿名实例化)
- database - Neo4j - 导入欺诈检测数据库
- cvx - Base Apply 和 Elementwise 函数 CVXR