【问题标题】:A word starting with t but ends with other than e以 t 开头但以非 e 结尾的单词
【发布时间】:2021-02-25 07:42:01
【问题描述】:

我正在尝试创建一个以 t 或 T 开头且不以 e 字母结尾的正则表达式。到目前为止,我尝试了下面的代码,但它并没有给我想要的结果。谁能告诉我这里到底缺少什么?

my_str = my_file.read()

word = re.findall("[tT].*[^e]$", my_str)

print(word)

【问题讨论】:

  • 您是否要在完整的句子/文本中查找单词?还是某个每行一个单词的数据库?换句话说,你有一些样本数据吗?顺便说一句,目前您允许在中间使用除换行符以外的任何字符(包括空格字符)。
  • 是的,它是文件中的文本。
  • 您可能想知道正则表达式中的\b 匹配单词边界...
  • 接下来,您必须确定单词中的合法字符是什么。可能[A-Za-z] 比您的. 更好猜测(即任何包含标点符号和空格的内容)。
  • 最后,如果你已经解决了你的问题,你可以发布一个我很乐意支持的答案。

标签: python python-3.x regex re


【解决方案1】:

你可以使用

\bt(?:[a-z]*[a-df-z])?\b
\bt[a-z]*\b(?<!e)

为了完整起见,这里有一个正则表达式来匹配任何以西里尔字母 т 开头且不以西里尔字母 е 结尾的单词:

\bт[^\W\d_]*\b(?<!е)

请参阅regex demo #1regex demo #2Cyrillic 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 - 单词边界(字符串的开头或紧跟在字符之后的位置,而不是数字、字母、下划线)
  • (?&lt;![a-z])(?&lt;![^\W\d_]) 是一个支持 Unicode 的等价物)- 与前面没有字母的位置相匹配的否定后向查找
  • t - t
  • (?:[a-z]*[a-df-z])? - 一个可选的非捕获组,匹配 0 个或多个字母,然后是 e 以外的字母
  • \b - 字边界
  • (?![a-z])(?![^\W\d_]) 是一个支持 Unicode 的等价物)- 与未紧跟字母的位置相匹配的否定前瞻。

还有,

  • \bt[a-z]*\b(?&lt;!e) 匹配单词边界、t、任何零个或多个小写 ASCII 字母(任何带有 re.I 的 ASCII 字母),然后单词边界标记单词的结尾,并且否定的向后查找 (?&lt;!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) )
# => ['таня']

【讨论】:

    【解决方案2】:

    也许:

    [\W]([Tt]\w*[^e])[\W]
    

    任何非单词字符后跟(捕获:Tt,一些可选单词字符,而不是 e)后跟第一个非单词字符

    【讨论】:

      【解决方案3】:

      还有另一种方法:

      re.findall(r"\b[Tt]+[a-zA-Z]*[^Ee\s]\b", my_str)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-31
        • 1970-01-01
        相关资源
        最近更新 更多