与包含点的字符串匹配时奇怪的正则表达式行为

伊万·比兰

我遇到以下情况,匹配似乎无法正常进行:

import re

test_case1 = u"I will meet you at 2 pm"
test_case2 = u"I will meet you at 2 p.m."
test_case3 = u"I will meet you at 2 p.m. "
test_case4 = u"I will meet you at 2 p.m. pm "

list_of_words = ['p.m.', 'pm'] # list of words that can be enlarged

# join all words into an or expression and escape all punctuation
joined_words = '|'.join([re.escape(x) for x in list_of_words]) 
# create a regex that will match a word from the list of words only if it is 
# at the start/end of the sentence or it is between two word boundaries
match_regex = r'(^|\b)('+joined_words+r')(\b|$)'
comp_regex = re.compile(match_regex, re.IGNORECASE) # compile the final regex

print comp_regex.findall(test_case1), len(comp_regex.findall(test_case1))
print comp_regex.findall(test_case2), len(comp_regex.findall(test_case2))
print comp_regex.findall(test_case3), len(comp_regex.findall(test_case3))
print comp_regex.findall(test_case4), len(comp_regex.findall(test_case4))

对于4个测试用例,我得到以下结果:

[(u'', u'pm', u'')] 1
[(u'', u'p.m.', u'')] 1
[] 0
[(u'', u'pm', u'')] 1

第一种和第二种情况似乎都可以正常工作,即使我在正则表达式中使用了“ \ b”字边界,第三种也不匹配“ pm”,即使后面有空格。

第四种情况似乎根本不匹配“ pm”,而仅匹配“ pm”。

我似乎无法理解问题所在,因此不胜感激。

沉默的

Python文档声明以下内容\b

匹配空字符串,但仅在单词的开头或结尾处匹配。单词定义为字母数字或下划线字符的序列,因此单词的结尾由空格或非字母数字,非下划线字符指示。请注意,正式地,\ b被定义为\ w和\ W字符之间的边界(反之亦然),或者\ w与字符串的开头/结尾之间的边界,因此被视为字母数字字符的精确字符集取决于在UNICODE和LOCALE标志的值上。例如,r'\ bfoo \ b'匹配'foo','foo。','(foo)','bar foo baz',但不匹配'foobar'或'foo3'。在字符范围内,\ b表示退格字符,以与Python的字符串文字兼容。

根据该定义.不能标记单词的末尾,因此\b不能匹配p.m.如果您对比赛进行以下更改,您将获得预期的行为:

match_regex = r'(^|\b)('+joined_words+r')(\s|$)'

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

正则表达式以匹配包含以点分隔的子字符串的字符串

来自分类Dev

Javascript正则表达式匹配用空格分隔但不包含点的字符串

来自分类Dev

Perl匹配字符串的正则表达式包含字母/数字/点

来自分类Dev

当字符串包含空格时,正则表达式不匹配

来自分类Dev

输入字符串包含与号时,正则表达式不匹配

来自分类Dev

正则表达式匹配不包含字符串的字符串

来自分类Dev

正则表达式匹配不包含子字符串的字符串

来自分类Dev

Ruby 正则表达式在匹配包含 \n 个字符的字符串时返回意外结果

来自分类Dev

如果字符串仅包含空格,则匹配的正则表达式是否匹配?

来自分类Dev

将正则表达式匹配项替换为包含匹配项的字符串

来自分类常见问题

分割不包含与Java中的正则表达式匹配的相邻字符的字符串

来自分类Dev

正则表达式以匹配包含特殊字符的数字字符串

来自分类Dev

正则表达式,仅与包含某些特定字符的字符串匹配

来自分类Dev

正则表达式:如果字符串包含自己,则匹配字符

来自分类Dev

正则表达式匹配至少不包含X个字符的字符串

来自分类Dev

使用正则表达式匹配包含数字和特殊字符的字符串

来自分类Dev

不可读的字符串与仅包含可读字符的正则表达式匹配

来自分类Dev

如何在包含某些字符的字符串中匹配正则表达式?

来自分类Dev

当输入字符串包含换行符时,为什么与正则表达式$的匹配返回1?

来自分类Dev

正则表达式:匹配字符串中的单词,但仅当行不包含斜杠时

来自分类Dev

正则表达式在匹配其他条件时查找不包含空格的字符串

来自分类Dev

正则表达式查找仅包含数字的字符串,但仅在以 # 或 \s 开头且后跟空格时匹配

来自分类Dev

正则表达式匹配点(。)之间的字符串(提取)

来自分类Dev

正则表达式匹配字符串中单词或单词之间的点(可选)

来自分类Dev

我想在字符串正则表达式后匹配点吗?

来自分类Dev

C# 正则表达式不匹配带有点的字符串

来自分类Dev

逗号或括号之间的正则表达式字符串,但不包含点

来自分类Dev

Python中的正则表达式无法解析包含点的字符串

来自分类Dev

在某个点之后不包含子字符串的正则表达式

Related 相关文章

  1. 1

    正则表达式以匹配包含以点分隔的子字符串的字符串

  2. 2

    Javascript正则表达式匹配用空格分隔但不包含点的字符串

  3. 3

    Perl匹配字符串的正则表达式包含字母/数字/点

  4. 4

    当字符串包含空格时,正则表达式不匹配

  5. 5

    输入字符串包含与号时,正则表达式不匹配

  6. 6

    正则表达式匹配不包含字符串的字符串

  7. 7

    正则表达式匹配不包含子字符串的字符串

  8. 8

    Ruby 正则表达式在匹配包含 \n 个字符的字符串时返回意外结果

  9. 9

    如果字符串仅包含空格,则匹配的正则表达式是否匹配?

  10. 10

    将正则表达式匹配项替换为包含匹配项的字符串

  11. 11

    分割不包含与Java中的正则表达式匹配的相邻字符的字符串

  12. 12

    正则表达式以匹配包含特殊字符的数字字符串

  13. 13

    正则表达式,仅与包含某些特定字符的字符串匹配

  14. 14

    正则表达式:如果字符串包含自己,则匹配字符

  15. 15

    正则表达式匹配至少不包含X个字符的字符串

  16. 16

    使用正则表达式匹配包含数字和特殊字符的字符串

  17. 17

    不可读的字符串与仅包含可读字符的正则表达式匹配

  18. 18

    如何在包含某些字符的字符串中匹配正则表达式?

  19. 19

    当输入字符串包含换行符时,为什么与正则表达式$的匹配返回1?

  20. 20

    正则表达式:匹配字符串中的单词,但仅当行不包含斜杠时

  21. 21

    正则表达式在匹配其他条件时查找不包含空格的字符串

  22. 22

    正则表达式查找仅包含数字的字符串,但仅在以 # 或 \s 开头且后跟空格时匹配

  23. 23

    正则表达式匹配点(。)之间的字符串(提取)

  24. 24

    正则表达式匹配字符串中单词或单词之间的点(可选)

  25. 25

    我想在字符串正则表达式后匹配点吗?

  26. 26

    C# 正则表达式不匹配带有点的字符串

  27. 27

    逗号或括号之间的正则表达式字符串,但不包含点

  28. 28

    Python中的正则表达式无法解析包含点的字符串

  29. 29

    在某个点之后不包含子字符串的正则表达式

热门标签

归档