与正则表达式的单词边界 - 无法提取所有单词

时间:2017-10-16 08:22:57

标签: python regex string findall boundary

我需要提取双Male-Cat

a = "Male-Cat Male-Cat Male-Cat-Female"
b = re.findall(r'(?:\s|^)Male-Cat(?:\s|$)', a)
print (b)
['Male-Cat ']

c = re.findall(r'\bMale-Cat\b', a)
print (c)
['Male-Cat', 'Male-Cat', 'Male-Cat']

我需要提取树时间Male-Cat

a = "Male-Cat Male-Cat Male-Cat"
b = re.findall(r'(?:\s|^)Male-Cat(?:\s|$)', a)
print (b)
['Male-Cat ', ' Male-Cat']

c = re.findall(r'\bMale-Cat\b', a)
print (c)
['Male-Cat', 'Male-Cat', 'Male-Cat']

通过第一种方式正确解析的另一个字符串:

a = 'Male-Cat Female-Cat Male-Cat-Female Male-Cat'
a = 'Male-Cat-Female'
a = 'Male-Cat'

缺少什么?你能解释一下什么是错的,什么是正确的方法?

1 个答案:

答案 0 :(得分:4)

使用lookarounds在空白边界内提取单词:

r'(?<!\S)Male-Cat(?!\S)'

请参阅online regex demo

<强>详情

  • (?<!\S) - 空格或字符串的开头必须立即显示在当前位置的左侧
  • Male-Cat - 要搜索的字词
  • (?!\S) - 字符串的空格或结尾必须立即显示在当前位置的右侧

由于(?<!\S)(?!\S)是零宽度断言,因此不会消耗空格,并且会找到连续匹配。