Regex:帮助查找字符串中的多个值(Python)



我需要从一个字符串中提取3个不同的细节。

模式为:

  1. "C">
  2. 任意类型的字符和数字。但是,顺序是1/2个字符后面跟着一个数字。
  3. "S"后面跟数字,可以包括特殊字符,如"-"one_answers"_">
  4. 然而,最后一个";分隔一个迭代器,可以丢弃

例子:

Input                   |      Expected output
---------------------------------------------------
C001F1S15_08            =>     ['C001','F1','S15']
C312PH2S1-06_5-0_12     =>     ['C312','PH2','S1-06_5-0']
C023_05                 =>     ['C023']
C002M5_02               =>     ['C002','M5']

如何做到这一点?

祝一切顺利

试试这个:

(Cd{3})([A-RT-Zd]+)?(S[d-_]+)?(?:_d+)

结果:https://regex101.com/r/FETn0U/1

您可以像这样提取值(使用Avinash的正则表达式)

import re
regex = re.compile(r"(Cd{3})([A-RT-Zd]+)?(S[d-_]+)?(?:_d+)")
text = "C001F1S15_08"
match = regex.match(text)
print(match.group(1))   # C001
print(match.group(2))   # F1
print(match.group(3))   # S15
print(match.groups())   # ('C001', 'F1', 'S15')
print(list(match.groups()[:3])) # ['C001', 'F1', 'S15']

查看这里了解更多信息。请记住,.group(0)指的是整个匹配,在本例中指的是输入字符串。

import re
lines = ["C001F1S15_08",          
"C312PH2S1-06_5-0_12",
"C023_05",               
"C002M5_02"]
for line in lines:
parts = line.split("_")
if len(parts) > 1:
parts = parts[:-1]

line = "_".join(parts)
print(line)
print(re.findall("Cd{3}|S[A-Za-z0-9_@./#&+-]+|[A-Za-z]+d+",line))

下面的模式将满足您的要求。我们丢弃最后一组

^(Cd{3})([A-Z]+d)?([-a-zA-Zd]+_[d-]+)?(_w+)?

见https://regex101.com/r/CKasXZ/2

result = []
str = ''.join(str.split('_')[:-1]) # For removing values after the last '_'.
result.append(str[0:4]) # for retrieve the 1st part of 4 elements.
for i in re.findall('[w]{1,2}[0-9-]+', str[4:]): # The regex cut the end after each group of 1 or 2 letters + numbers and '-'. 
result.append(i) # for retrive each values from the regex otherwise you have a list in a list.
result

我想你可以简化这个循环,但是我不知道怎么做。

最新更新