Python使用正则表达式捕获字符串内的特定模式

时间:2019-03-02 11:18:39

标签: python regex pattern-matching extract

我有一个像这样的字符串'6\' 3" ( 190 cm )',我只想使用正则表达式提取'190 cm'。我找不到适合的模式。

我尝试过

string = '6\' 3" ( 190 cm )'
pattern = re.compile(r'[^\\( 0-9+ \\)]')
pattern.findall(a)

但返回     [“'”,'“','c','m']

感谢您的帮助!

4 个答案:

答案 0 :(得分:3)

print re.findall(r'[0-9]+ cm',string)[0]

其中string是:

'6\' 3" ( 190 cm )'

答案 1 :(得分:2)

表达式中不必要的有害符号过多。

使用[]周围的findall来匹配各个字符,这说明了您得到的输出。

这需要重新考虑:转义括号,使用\d+匹配一个或多个数字,并使用显式cm和空格。

创建一个仅匹配数字和单位的组,使用search查找并显示该组。

import re
string = '6\' 3" ( 190 cm )'
pattern = re.compile(r'\( (\d+ cm) \)')

>>> pattern.search(string).group(1)
'190 cm'

答案 2 :(得分:2)

使用正则表达式:

import re

s = '6\' 3" ( 190 cm )'
desired_output = re.search(r'\((.*?)\)',s).group(1).lstrip()

print(desired_output)
>>> 190 cm

没有正则表达式:

s = '6\' 3" ( 190 cm )'
desired_output = s[s.find("(")+1:s.find(")")].lstrip()

print(desired_output)
>>> 190 cm

答案 3 :(得分:1)

您可以使用捕获组,该捕获组将由findall返回:

\(\s*([0-9]+\s*[a-z]+)\s*\)

这将匹配:

  • \(\s*匹配(,并且0+次是空白字符
  • (捕获组
    • [0-9]+\s*[a-z]+匹配1+个数字,0 +倍空白字符和1+倍az(如果要字面匹配,请使用cm而不是[a-z]+
  • )关闭捕获组
  • \s*\)匹配0+次空白字符

regex101 demo | Python demo

例如:

import re

string = '6\' 3" ( 190 cm )'
pattern = re.compile(r"\(\s*([0-9]+\s*[a-z]+)\s*\)")
print(pattern.findall(string))