2016-10-19 4 views
0

정규 표현식이 새롭지 만 약 2 백만 개의 문자열에 패턴을 일치시키고 싶습니다. 표시된 원산지 문자열의 이 세 가지 형태 다음은 :정규 표현식의 사용

EC-2A-07<EC-1D-10> 
EC-2-07 
T1-ZJF-4 

나는 EC, 2A, 07 각각 싶어 말을하는 것입니다 -, 이외의 문자열의 세 부분으로 싶어. 특히, 첫 번째 문자열의 경우, 부품을 < 전에 나눠야합니다.

나는 .+[\d]\W을 시도했으나 EC-2-07을 인식하지 못했고 .split('-')을 사용하여 문자열을 분할 한 다음 반환 된 목록의 색인을 사용하여 원하는 결과를 얻었습니다. 그러나 그것은 효율적이지 못하다.

내 요구 사항을 충족하는 효율적인 정규 표현식을 찾아 낼 수 있습니까 ?? 고마워요!

+0

시도의 [ '([A-Z0-9] {2}) - ([A-Z0-9] {1,3}) - ([A-Z0- 9] {1,2})'] (https://regex101.com/r/8iMy6k/1). –

+0

@ WiktorStribiżew 질문에 대한 답변보다 더 빨리 답장을 보냅니다! 내가 정규식 질문에 시간이 없어. LOL – antoni

+0

@antoni : 나는 단지 작동하는 것처럼 보이지만, 실제 요구 사항이 누락되어 OP 용으로 작동한다는 보장은 없다. 유효하고 좋은 답변을 제공하는 데 더 많은 시간이 걸립니다. 물론 분명한 질문입니다. –

답변

1

당신은 regex demo

참조

^([A-Z0-9]{2})-([A-Z0-9]{1,3})-([A-Z0-9]{1,2}) 

를 사용할 필요가개

세부 :

  • ^ - 그룹 1 2 개 대문자 ASCII 문자 또는 숫자 캡처 - - -을 - 하이픈
  • ([A-Z0-9]{1,3}) - 문자열
  • ([A-Z0-9]{2})의 시작 그룹이 포착 1-3 대문자 ASCII 자 또는 숫자
  • - - 하이픈
  • ([A-Z0-9]{1,2}) - 그룹 3은 1 - 2 자의 대문자 ASCII 문자 또는 숫자를 캡처합니다. 필요에 따라

당신은 {min,max} 한정사의 값을 조정할 수 있습니다.

샘플 Python demo :

import re 
regex = r"^([A-Z0-9]{2})-([A-Z0-9]{1,3})-([A-Z0-9]{1,2})" 
test_str = "EC-2A-07<EC-1D-10>\nEC-2-07\nT1-ZJF-4" 
matches = re.findall(regex, test_str, re.MULTILINE) 
print(matches) 
#or with lines 
lines = test_str.split('\n') 
rx = re.compile("([A-Z0-9]{2})-([A-Z0-9]{1,3})-([A-Z0-9]{1,2})") 
for line in lines: 
    m = rx.match(line) 
    if m: 
     print('{0} :: {1} :: {2}'.format(m.group(1), m.group(2), m.group(3)))