>source

다음과 같은 문자열이 있습니다.

ART-B-C-ART0015-D-E01
ADC-B-C-ADC00112-V-E01
AEE-B-C-AEE00011-D-E01
AQW-B-C-AQW0013-D-E01
AAZ-B-C-AAZ0014-D-E01
AQQ-B-C-AQQ0032-D-E01
ADD-B-C-D-ADD0001-D-E01
AAA-B-C-AAA0012-D-E01

아래 결과를 원합니다. 예상 결과:

ART0015
ADC00112
AEE00011
AQW0013
AAZ0014
AQQ0032
ADD0001
AAA0012

나는 아래 정규식 코드를 사용했고 불행히도 7 번째 레코드가 세 번째 대시에 없기 때문에 예상 결과를 얻지 못했습니다. 네 번째 대시에 있습니다.

df["A"].str.extract(r'^(?:[^-]*-){3}\s*([^-]+)', expand=False)
0     ART0015
1    ADC00112
2    AEE00011
3     AQW0013
4     AAZ0014
5     AQQ0032
6        D
7     AAA0012

  • 답변 # 1

    사용하다 Series.str.extract 3 글자 검색 후 4-5 번호:

    In [477]: df['col'] = df['col'].str.extract(r'([a-zA-Z]{3}\d{4,5})')
    In [478]: df
    Out[478]: 
    0   ART0015
    1  ADC00112
    2  AEE00011
    3   AQW0013
    4   AAZ0014
    5   AQQ0032
    6   ADD0001
    7   AAA0012
    
    

  • 답변 # 2

    오른쪽에서 계산을 시작하면 모든 코드가 세 번째 대시에 있습니다. 당신이 할 수있는 일은 문자열을 뒤집은 다음 결과를 얻은 후 다시 뒤집는 것입니다. 형식이 안정적이지 않은 경우 대시 사이의 코드 길이를 계산하고 필요한 값과 일치 할 때이를 수락하거나 인쇄하는 것과 같은 다른 방법을 찾으십시오.

  • 답변 # 3

    다음 정규식을 사용하여 7 개 또는 8 개의 반복되는 영숫자 문자를 검색 할 수 있으며 출력은 더 높은 우선 순위를 갖습니다.

    df['A'] = df['A'].str.extract('-([A-Za-z0-9]{7,8})-')
          A
    0   ART0015
    1   ADC00112
    2   AEE00011
    3   AQW0013
    4   AAZ0014
    5   AQQ0032
    6   ADD0001
    7   AAA0012
    
    

관련 자료

  • 이전 arrays - Java 문자열을 정수로 캐스트 할 수 있는지 구분 된 문자열을 분할하는 방법
  • 다음 c++ - 재귀 함수에서 변수를 한 번만 정의하고 초기화하는 방법은 무엇입니까?