2013-09-07 2 views
1

나는 다음과 같은 라인을 포함, 다양한 형식의 tracklistings을 구문 분석에 관심이 :더 나은 임의 tracklistings를 구문 분석하는 방법

artist - title 
artist-title 
artist/title 
artist - "title" 
1. artist - title 
0:00 - artist - tit le 
05 artist - title 12:20 
artist - title [record label] 

이 일반적으로 하나 개의 트랙리스트를 포함하지만, 이는 또한 다른 재료를 포함 할 수 있습니다 텍스트 파일있는 구문 분석하고 싶지 않습니다. 그래서 정규 표현식은 트랙 목록이 아닌 행을 포함하지 않을 정도로 엄격해야합니다. 실제로 이것은 아마도 균형의 문제 일 것입니다.

나는 다음과 같은 정규식 일부 성공을 데 :

simple = re.compile(r""" 
^ 
(?P<time>\d?\d:\d\d)? # track time in 00:00 or 0:00 
(
(?P<number>\d{1,2}) # track number as 0 01 
[^\w]     # not followed by word 
)? 
[-.)]?    # possibly followed by something 
"? 
(?P<artist>[^"@#]+) # artist anything except "@# 
"? 
\s[-/\u2013]\s 
"?     # dash surrounded by spaces, possibly unicode 
(?P<title>[^"@#]+?) # title, not greedy 
"? 
(?P<label>\[\w+\])? # label i.e. [something Records] 
(//|&\#13;)?   # remove some weird endings, i.e. ascii carriage return 
$ 
""", re.VERBOSE) 

그러나, 나는 매우 최근에 정규 표현식을 배우기 시작, 조금 무서운입니다. 2 트랙 번호가 계정으로, 즉 주변 상황을하는 것입니다 아니라는 것을 말하는 유일한 방법 - '2 틀고'2 Croozin의 경우

an artist-a title   # couldn't find ' - ' 
2 Croozin' - 2 Pumpin'  # mistakes 2 as track number 
05 artist - title 12:20 # doesn't work at all 

: 그것은이 같은 라인에 문제가 다른 트랙을보세요. (나는 이것을 잊었다 -이 대위는 보통 tracklist의 일부분이다)

내 질문은, 어떻게 이것을 일반적으로 향상시킬 수 있는가? 내가 가진 몇 가지 아이디어는 다음과 같습니다.

  • 매우 구체적인 것으로부터 시작하여 몇 가지 정규식을 사용하고 적절하게 구문 분석 될 때까지 덜 구체적인 것을 사용하십시오.
  • 덤프 정규식과 같은 상황을 둘러싼를보다 효율적으로 사용할 수있을 대한 파싱 또는 파슬리 등의 적절한 파서를 사용하지만 나는
  • 사용 내다가/lookbehind 여러 줄 정규식에서 이전에보고 해석 대해 아무것도 몰라
  • 사용하는 별도의 정규식 시간을 얻을/다음 라인, 트랙 번호, 아티스트,
  • 포기 덜 무의미한 일을 할 제목

나는이 (어느 정도)가 제대로 해석 것을 확인할 수 있습니다 일을 아티스트와 타이틀이 모두 다르다는 것을 확인하는 것, 트랙 순서대로, 시간은 현명하고, 가능하게는 체크 아티스트/타이틀/라벨이 실제로 존재합니다.

+1

당신은 mp3s 또는 그와 유사한 메타 데이터를 가지고있는 무리를 가지고 있지 않습니다.또는 말 그대로 텍스트 파일과 줄 또는 목록을 처리하려고 시도하고 있습니까? –

+1

문법의 고유 한 모호성으로 인해 여러 가지 방법을 파싱 해보고 각 방법을 확인해야합니다. "(어느 정도는 유효성 검사를 할 수 있다고 언급했다.) 그런 다음 첫 번째 구문 분석을 선택하거나 구문 분석에 사용되는 가중치를 할당하고"최상의 "구문을 선택하여 구문 분석에 가중치를 할당 할 수 있습니다 감각. 나는 모든 것을 하나의 정규식으로 밀어 넣을 것이라고 생각하지 않는다. 일종의 토큰 화와 함께 작업 한 다음 파싱해야합니다. (당신이 원한다면 토큰 화에 regexes를 사용할 수있다.) – kqr

+0

@JonClements : 질문 해 주셔서, 나는 컨텍스트를 충분히 제공하지 못했고 질문을 업데이트했다. – eggbert

답변

1

기껏해야, 정규 표현식 만 단독으로 처리하고 구문 분석 할 수있는 영역 밖으로 사용자를 이동시키는 context-sensitive grammar을 다루는 것이 가장 좋습니다.

파서가 regexps 및 휴리스틱 더미로 구현되는 경우에도 파서는 여전히 파서이므로 파싱의 기술은 가치가 있습니다. 일부 언어에는 닭고기 달걀 문제가 있습니다. "이전에는 왕자로 알려진 예술가로서 이전에는 아티스트로 알려져 있었지만 트랙 제목이 아닌 아티스트로 전화하고 싶습니다. 그러나 두 번째로 볼 때까지는 그 결정을 내리는 문맥

@JonClements 주석을 증폭하려면 파일에 내부 메타 데이터가 포함되어 있으면 해당 정보를 추출하고 조작 할 수있는 많은 도구가 있습니다. 내부 메타 데이터가 "균형 문제에 관한 질문"이 앨범 제목 일 확률을 높이더라도 해당 정보가 필요합니다.

오픈 소스 태그 조작기 (예 : EasyTag)를 찾아서 어떻게 사용하는지 확인하십시오. 학습하는 동안, 당신은 당신을 위해 일하는 도구를 찾을 수 있습니다.

+1

답변으로 추가 했으므로 (예술가/앨범/트랙 이름과 관련하여) 활용할 수있는 잠재적 정보 소스는 다음과 같습니다. http : //www.freebase. co.kr / –