正则表达式:匹配字符(字符串开头除外)

时间:2019-12-04 23:41:19

标签: python regex python-3.x

我正在尝试从字符串中剥离一个字符,除非该字符位于字符串的开头。

到目前为止,我的代码如下:

def strip_string(value):
  return re.sub(r"[^0-9\.]",'',value)

# strip_string('1-23') => '123'

我只想删除第一个字符没有的破折号:

strip_string('-1-23') => '-123'

我知道如何定位作为第一个字符(r"^-")而不是反字符的破折号。

是否可以执行此操作,或者是否需要以其他方式处理?

1 个答案:

答案 0 :(得分:2)

从不在开头的字符串中删除字符的最简单解决方案是使用(?!^) / (?!\A)否定先行。但是,您不能只使用re.sub(r"(?!^)[^0-9.]",'',value),因为它也不会删除非连字符,而您的情况暗示您期望只在开始时保留连字符。

因此,在Python 3.5及更高版本中,您可以使用(请参阅demo):

re.sub(r"^(-)|[^0-9.]+", r"\1", value)

或者,您可能会退回到

re.sub(r"(?!^)-|[^0-9.-]+", "", value)   # This one is somewhat easier to understand
re.sub(r"-(?<!^-)|[^0-9.-]+", "", value) # This one is a bit more efficient

请参见demo #1demo #2

-(?<!^-)(?!^)-都与不在字符串开头的-匹配。