Word boundary with regex - cannot extract all words

丶灬走出姿态 提交于 2019-12-18 09:12:18

问题


I need extract double 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']

I need extract tree times 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']

Another strings which are parsed correctly by first way:

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

Something missing? Can you explain what is wrong and what is correct way?


回答1:


Use lookarounds to extract words inside whitespace boundaries:

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

See the online regex demo

Details

  • (?<!\S) - a whitespace or start of string must appear immediately to the left of the current location
  • Male-Cat - the term to search for
  • (?!\S) - a whitespace or end of string must appear immediately to the right of the current location

Since (?<!\S) and (?!\S) are zero-width assertions, the whitespace won't be consumed, and consecutive matches will get found.



来源:https://stackoverflow.com/questions/46765886/word-boundary-with-regex-cannot-extract-all-words

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!