2016-09-23 8 views
2

장치에서 SIM 카드의 ICCID를 반환하고 인쇄하려고합니다. SIM 카드는 다양한 공급 업체에서 제공되므로 길이가 다릅니다 (19 또는 20 자리). 결과적으로 ICCID를 추출 할 정규 표현식을 찾고 있습니다 (즉, 단어를 둘러싸고있는 단어가 아닌 문자에 대해 불가지론적인 방식으로). 이것은 함께 내가 테스트했던 가장 성공적인 패턴 (했다regex를 사용하여 문자열에서 ICCID 추출

(89\d{17,18}) 

:

는 ICCID가 19 ~ 20 자리 문자열을 "89"로 시작으로 지정되는 것을 감안할 때, 나는 단순히위한 갔어요 일부 패턴은 아래 이유로 거부 됨). 내가로부터 추출하고있어 문자열에서

는 ICCID 즉시 캐리지 리턴 후 라인 피드,하지만 \r과 종료에 대한 몇 가지 테스트, \n 다음에, 또는 \b는 (프로그램을 작동 실패 내가 사용하고있는 것은 사내에서 파이썬으로 작성된 것이므로 정규 표현식에서 사용하는 것으로 생각됩니다). 또한 단순히 (\d{19,20})을 사용하면 20 자리 ICCID의 마지막 19 자리 (세 번째 및 마지막 유효한 일치 항목)가 추출됩니다. 같은 줄을 따라, 원칙적으로 (\d{19,20})?을 배제했는데 처음 19 자리를 찾으면 끝내기를 기대합니다.

그래서 내 질문은 : 내가 선택한 패턴을 사용해야합니까, 또는 가변 길이의 가장 긴 부분 문자열을 반환 할 더 좋은 표현식 (문자열을 프레임에 단어가 아닌 문자 사용 안함)이 있어야합니까? 자릿수?

+0

정말 구문 분석 할 파일/텍스트의 형식에 따라 다릅니다. https://regex101.com/#python과 같은 정규 표현식 테스터에서 표현을 '튜닝'하시길 권합니다. (검색을 시뮬레이션하기 위해 "g"모드 사용) –

+0

'\ d {19,20}'만 왜 이해가 안나요? 20 개의 문자 중 19 개의 문자와 일치합니다. 한정 기호는 탐욕적입니다. –

+0

@ WiktorStribiżew 나는 그것이 처음 19 자리, 그 다음 모두 20 자리, 그리고 마지막 19 자리와 일치한다고 생각한다. 마지막 경기가 있기 때문에 그것이 반환됩니다. – Myles

답변

1

장면 뒤에 엔진이 정말 파이썬, 당신은 추출 할 필요가 값 주위 이외의 자리에 문자가있을 경우, 사용 lookarounds이 값 주변의 문맥 제한 :

(?<!\d)89\d{17,18}(?!\d) 
^^^^^^^   ^^^^^^ 

(?<!\d)을 loobehind는 경기 전에 숫자가없는 것을 요구할 것이고 (?!\d) negative lookahead는 그 값 다음에 자리가 없어야 할 것입니다.

은 쉽게 트릭을 할 것 같은 this regex demo

1

나는이 18 자리 숫자를 선호한다

89\d{17,18}[^\d] 

가고 싶어하지만, 17도 충분할 것입니다. 그 후에 더 이상 다른 숫자 문자는 허용되지 않습니다.

제한 사항 : ICCID 다음에 적어도 하나 이상의 문자가 있어야합니다 (설명 된 내용에서 정상이어야합니다).

"89"뒤에 17 또는 18 자의 숫자가 나오는 더 긴 숫자 시퀀스도 일치한다는 점에 유의하십시오.

+0

이렇게 많은 해결책이 있습니다. 그러나 이것은 충분히 잘 작동합니다. – freefall

+0

'Python'은'\ d'와'[^ \ d]'를 제공합니다. ** \\ *를 더 많이 쓰려면 ** \ D *를 사용하십시오. – Jan

0
(\d+)\D+ 

보인다 참조하십시오. (\ d +)는 20 개의 숫자를 포착합니다. \ D +는 나중에 다른 것과 일치합니다.

관련 문제