如何在Python中将正则表达式匹配到特定字符,如果不匹配则返回None?

时间:2019-02-11 08:34:23

标签: python regex python-3.x

我想知道是否可以匹配正则表达式,直到特定字符(':'),但避免使用诸如[^:] *之类的负逻辑表达式,因为如果遇到不匹配项,我希望它返回None 。查看预期的示例:

import re
string='AbcS:sdaf'
pattern='whatever needed' # match all up to : 
re.search(pattern, string).group()

'AbcS'

string2='AbcSsdaf'
pattern2='whatever needed' # match all up to : 
re.search(pattern2, string2).group()

None

在其他文章中,我看到了一些答案mencioning pattern ='[^:] *',但这不是我想要的,因为如果字符串中没有':',则会返回所有字符串。

谢谢大家

4 个答案:

答案 0 :(得分:3)

尝试此正则表达式:

^(?=.*:)[^:]*

Click for Demo

说明:

  • ^-断言字符串的开头
  • (?=.*:)-正向前进,以确保该行包含:
  • [^:]*-匹配0+次出现的不是:的任何字符

答案 1 :(得分:0)

您需要一个捕获小组:

pattern = '(.*):'  # this will match any and all characters up untill ":"
pattern = '([a-zA-Z])*:'  # this will match only letters
pattern = '([a-zA-Z0-9])*:'  # matches alphanumericals
  

如果您说出搜索条件,您将很容易记住如何自己重新创建搜索条件:捕获“()”任何“”。尽可能多地使用“ *”,直到看到分号“:”为止。

最重要的是,如果搜索字符串中没有“:”,re.search将返回None。

答案 2 :(得分:0)

一种非正则表达式的方法是使用:进行拆分并计算拆分次数。如果大于1,则获取第一个项目,否则返回None:

splits = s.split(':')
if len(splits) > 1:
    print(splits[0])
else:
    print(None)

请参见this Python demo

您也可以使用正则表达式方法,例如

^([^:]*):

,如果有匹配项,则抓住第1组。参见regex demo

详细信息

  • ^-字符串的开头
  • ([^:]*)-捕获第1组::以外的任意0+个字符
  • :-一个:字符。

Python demo

import re
strs= ['AbcS:sdaf', 'AbcSsdaf']
pattern= re.compile(r'([^:]*):') # re.match requires a match at  string start, ^ is redundant
for s in strs:
    m = re.match(pattern, s)
    if m:
        print(m.group(1))
    else:
        print(m)

答案 3 :(得分:0)

尝试以下操作:re.search(pattern, string.split(":")[0]).group()