나는 다음과 같은 라인을 포함, 다양한 형식의 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 여러 줄 정규식에서 이전에보고 해석 대해 아무것도 몰라
- 사용하는 별도의 정규식 시간을 얻을/다음 라인, 트랙 번호, 아티스트,
- 포기 덜 무의미한 일을 할 제목
나는이 (어느 정도)가 제대로 해석 것을 확인할 수 있습니다 일을 아티스트와 타이틀이 모두 다르다는 것을 확인하는 것, 트랙 순서대로, 시간은 현명하고, 가능하게는 체크 아티스트/타이틀/라벨이 실제로 존재합니다.
당신은 mp3s 또는 그와 유사한 메타 데이터를 가지고있는 무리를 가지고 있지 않습니다.또는 말 그대로 텍스트 파일과 줄 또는 목록을 처리하려고 시도하고 있습니까? –
문법의 고유 한 모호성으로 인해 여러 가지 방법을 파싱 해보고 각 방법을 확인해야합니다. "(어느 정도는 유효성 검사를 할 수 있다고 언급했다.) 그런 다음 첫 번째 구문 분석을 선택하거나 구문 분석에 사용되는 가중치를 할당하고"최상의 "구문을 선택하여 구문 분석에 가중치를 할당 할 수 있습니다 감각. 나는 모든 것을 하나의 정규식으로 밀어 넣을 것이라고 생각하지 않는다. 일종의 토큰 화와 함께 작업 한 다음 파싱해야합니다. (당신이 원한다면 토큰 화에 regexes를 사용할 수있다.) – kqr
@JonClements : 질문 해 주셔서, 나는 컨텍스트를 충분히 제공하지 못했고 질문을 업데이트했다. – eggbert