我想知道是否可以匹配正则表达式,直到特定字符(':'),但避免使用诸如[^:] *之类的负逻辑表达式,因为如果遇到不匹配项,我希望它返回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 ='[^:] *',但这不是我想要的,因为如果字符串中没有':',则会返回所有字符串。
谢谢大家
答案 0 :(得分:3)
答案 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+个字符:
-一个:
字符。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()