Python 如何提取不后跟关键字的数字

Python 如何提取不后跟关键字的数字,python,regex,Python,Regex,我想从字符串中获取十进制数,但后面不能跟'/套'. pattern = '(\d{1,}\.{0,1}\d{0,}万{0,1}-{0,1}\d{0,}\.{0,1}\d{0,}万{0,1})元{0,1}(?!/套)' string1 = 'item 1:298元/套起' string2 = 'item 1:298元/m2起' string3 = 'item 1:298/m2起' result1 = re.findall(pattern, string1) #expected [], but r

我想从字符串中获取十进制数,但后面不能跟'/套'.

pattern = '(\d{1,}\.{0,1}\d{0,}万{0,1}-{0,1}\d{0,}\.{0,1}\d{0,}万{0,1})元{0,1}(?!/套)'
string1 = 'item 1:298元/套起'
string2 = 'item 1:298元/m2起'
string3 = 'item 1:298/m2起'

result1 = re.findall(pattern, string1) #expected [], but return ['1', '298']
result2 = re.findall(pattern, string2) #expected [298], but return ['1', '298', '2']
result3 = re.findall(pattern, string3) #expected [298], but return ['1', '298', '2']
如何得到正确答案


谢谢

如果我理解正确,使用“向前看”和“向后看”是相当简单的

(?<=:)(\d+)(?!.*套)    : Using positive look behind to make sure the number is preceded by a colon, doesn't include the colon in the "full match"
:(\d+)(?!.*套)         : Not using positive look behind; colon is included in "full match" but not in groups


(?<=:)(\d+)(?!.*套)
(?<=                   : Start of positive look behind
    :                  : String to search for
     )                 : End of positive look behind
      (                : Start of capture group
       \d+             : Capture any number 1 or more times
          )            : End of capture group
           (?!         : Start of negative look ahead
              .*       : Greedy "capture anything" before string we're trying to avoid
                套     : String we're trying to avoid
                  )    : End of negative look ahead
(?注意:

  • {0,1}
    =
  • {0,}
    =
    *
  • {1,}
    =
    +
使用

解释

--------------------------------------------------------------------------------
  (                        group and capture to \1:
--------------------------------------------------------------------------------
    \d+                      digits (0-9) (1 or more times (matching
                             the most amount possible))
--------------------------------------------------------------------------------
    \.?                      '.' (optional (matching the most amount
                             possible))
--------------------------------------------------------------------------------
    \d*                      digits (0-9) (0 or more times (matching
                             the most amount possible))
--------------------------------------------------------------------------------
    万                  '万'
--------------------------------------------------------------------------------
    ;?                       ';' (optional (matching the most amount
                             possible))
--------------------------------------------------------------------------------
    -?                       '-' (optional (matching the most amount
                             possible))
--------------------------------------------------------------------------------
    \d*                      digits (0-9) (0 or more times (matching
                             the most amount possible))
--------------------------------------------------------------------------------
    \.?                      '.' (optional (matching the most amount
                             possible))
--------------------------------------------------------------------------------
    \d*                      digits (0-9) (0 or more times (matching
                             the most amount possible))
--------------------------------------------------------------------------------
    万                  '万'
--------------------------------------------------------------------------------
    ;?                       ';' (optional (matching the most amount
                             possible))
--------------------------------------------------------------------------------
  )                        end of \1
--------------------------------------------------------------------------------
  元                  '元'
--------------------------------------------------------------------------------
  ;?                       ';' (optional (matching the most amount
                           possible))
--------------------------------------------------------------------------------
  /                        '/'
--------------------------------------------------------------------------------
  (?!                      look ahead to see if there is not:
--------------------------------------------------------------------------------
    套                 '套'
--------------------------------------------------------------------------------
  )                        end of look-ahead

{0,1}可以缩写为?{0,}可以缩写为*
--------------------------------------------------------------------------------
  (                        group and capture to \1:
--------------------------------------------------------------------------------
    \d+                      digits (0-9) (1 or more times (matching
                             the most amount possible))
--------------------------------------------------------------------------------
    \.?                      '.' (optional (matching the most amount
                             possible))
--------------------------------------------------------------------------------
    \d*                      digits (0-9) (0 or more times (matching
                             the most amount possible))
--------------------------------------------------------------------------------
    万                  '万'
--------------------------------------------------------------------------------
    ;?                       ';' (optional (matching the most amount
                             possible))
--------------------------------------------------------------------------------
    -?                       '-' (optional (matching the most amount
                             possible))
--------------------------------------------------------------------------------
    \d*                      digits (0-9) (0 or more times (matching
                             the most amount possible))
--------------------------------------------------------------------------------
    \.?                      '.' (optional (matching the most amount
                             possible))
--------------------------------------------------------------------------------
    \d*                      digits (0-9) (0 or more times (matching
                             the most amount possible))
--------------------------------------------------------------------------------
    万                  '万'
--------------------------------------------------------------------------------
    ;?                       ';' (optional (matching the most amount
                             possible))
--------------------------------------------------------------------------------
  )                        end of \1
--------------------------------------------------------------------------------
  元                  '元'
--------------------------------------------------------------------------------
  ;?                       ';' (optional (matching the most amount
                           possible))
--------------------------------------------------------------------------------
  /                        '/'
--------------------------------------------------------------------------------
  (?!                      look ahead to see if there is not:
--------------------------------------------------------------------------------
    套                 '套'
--------------------------------------------------------------------------------
  )                        end of look-ahead