【问题标题】:Regular expression to group a pattern OR group empty string as ""将模式分组或将空字符串分组为“”的正则表达式
【发布时间】:2014-05-02 16:20:47
【问题描述】:

我正在使用带有正则表达式的 Python 3.3.2。我有一个非常简单的功能

def DoRegexThings(somestring):
    m = re.match(r'(^\d+)( .*$)?', somestring)
    return m.group(1)

我使用它来获取字符串开头的数字部分,并丢弃其余部分。但是,在空字符串的情况下它会失败,因为它无法匹配组。

我查看了之前询问过的this similar question,并将我的正则表达式更改为:

(^$)|(^\d+)( .*$)?

但它只会导致它每次都返回"None",并且仍然在空字符串上失败。我真正想要的是一个正则表达式,我可以用它来获取记录的数字部分,例如如果记录是1234 sometext,我只想要1234,或者如果字符串是空的,我想要m.group(1) 返回一个空字符串。我现在的解决方法是

m = re.match(r'(^\d+)( .*$)?', somestring)
if m == None: # Handle empty string case
    return somestring
else:
    return m.group(1)

但如果我可以避免检查匹配对象 None,我愿意。有没有办法做到这一点?

【问题讨论】:

  • (^$)|(^\d+)( .*$)? 将“工作”,即使对于空字符串,但当然数字(如果匹配)现在将在第 2 组而不是第 1 组中,因为您添加了另一个捕获组(即将匹配它之前的空字符串)。
  • 另外,如果您需要与None进行比较,请使用if m is None:而不是if m == None:,但在这种情况下,if not m: 将是首选解决方案- 但是,您不需要(请参阅我的回答)。

标签: regex python-3.x


【解决方案1】:

我认为你把这件事弄得太复杂了:

re.match(r"\d*", somestring).group()

如果它位于字符串的开头,则返回一个数字(.match() 确保这一点),如果没有数字,则返回空字符串。

>>> import re
>>> somestring = "987kjh"
>>> re.match(r"\d*", somestring).group()
'987'
>>> somestring = "kjh"
>>> re.match(r"\d*", somestring).group()
''

【讨论】:

  • 这正是我所需要的,而且比我的做法要好得多。谢谢!
猜你喜欢
  • 1970-01-01
  • 2014-07-23
  • 2016-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-19
相关资源
最近更新 更多