繁体   English   中英

仅当带空格,句点或什么都没有正则表达式时,才使用Python匹配字符串中的字母吗?

[英]Use Python to match a letter in a string only when followed by a space, period, or nothing, without regex?

我正在尝试编写此代码以提高可读性,但是最后一个“ for x in measurement”显然不起作用。

以下打印“ t”,但我不希望它与“ test”匹配
如果确实是测试用例,我确实希望它与“ this at at”的“ t”相匹配。

是否可以不使用正则表达式?

measurements = ['t', 'tsp', 'T', 'tbl', 'tbs', 'tbsp', 'c']
measurements = ([' ' + x + ' ' for x in measurements] + #space on either side
                [' ' + x + '.' for x in measurements] + #space in front, period in back
                [' ' + x + '' for x in measurements])   #space in front, nothing in back???

string_to_check = 'this is a test'

for measurement in measurements:
    if measurement in string_to_check:
        print(measurement)

在这里您可以使用re.search

>>> measurements = ['t', 'tsp', 'T', 'tbl', 'tbs', 'tbsp', 'c']
>>> measurements = ([' ' + x + ' ' for x in measurements] + [' ' + x + '\.' for x in measurements] + [' ' + x + r'\b' for x in measurements])
>>> measurements
[' t ', ' tsp ', ' T ', ' tbl ', ' tbs ', ' tbsp ', ' c ', ' t\\.', ' tsp\\.', ' T\\.', ' tbl\\.', ' tbs\\.', ' tbsp\\.', ' c\\.', ' t\\b', ' tsp\\b', ' T\\b', ' tbl\\b', ' tbs\\b', ' tbsp\\b', ' c\\b']
>>> string_to_check = 'this is a test'
>>> for measurement in measurements:
    if re.search(measurement, string_to_check):
         print(measurement)


>>>

我在这里做了两件事。

  • [' ' + x + '\\.' for x in measurements] [' ' + x + '\\.' for x in measurements] ,请按顺序转义点以匹配文字点,因为点是regex中的特殊元字符,可以匹配任何字符。

  • [' ' + x + r'\\b' for x in measurements]添加字边界\\b ,由于\\b单词字符和非字符字之间的匹配,因此不会接spacet<space>test

问题在于,您所编码的含义“与它无关”。

您已经在数组中包括了字符串't',它是字符串'this is a test'的子字符串[即,它位于单词test的前面]。

如果您想让“后面没有内容”的意思是“字符串末尾”,那么您必须检查字符串末尾是什么,而不是使用子字符串搜索。

测量
[' t ', ' tsp ', ' T ', ' tbl ', ' tbs ', ' tbsp ', ' c ', ' t.', ' tsp.', ' T.', ' tbl.', ' tbs.', ' tbsp.', ' c.', ' t', ' tsp', ' T', ' tbl', ' tbs', ' tbsp', ' c']

您可以在测量结果中找到“ t”。因此在您的检查字符串“ this is aest”中找到“ t”。
因此,返回“ t”是正确的。

如果您想完全匹配't'而不是'txxx',则需要
[' ' + x + r'\\b' for x in measurements]

一种可能的非正则表达式方法是将string_to_check分成单词列表。 然后in将寻找完全匹配的单词。

measurements = ['t', 'tsp', 'T', 'tbl', 'tbs', 'tbsp', 'c']

string_to_check = 'this is a test'
words_to_check = string_to_check.replace('.', ' ').split()
for measurement in measurements:
    if measurement in words_to_check:
        print(measurement)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM