2013-09-03 1 views
3

두 가지 유형의 파일이 있습니다. 또 다른 타격으로 선 포함두 형식을 모두 처리하는 RE

"55.28 LongUrl0.20s: Preplan Async" 

:

아래와 같은 라인이 포함되어

>55.28 LongUrl0.20s: Preplan Async</a></span><br></td> 

두 경우 모두를, 나는 내용이 LongUrl로 시작하고 끝나는 좀하고 싶습니다 </a> 또는 행의 끝.

>>> b="55.28 LongUrl0.20s: Preplan Async" 
>>> a=">55.28 LongUrl0.20s: Preplan Async</a></span><br></td>" 
>>> re.findall(r'LongUrl\d*.\d*s:[^<]+',a) 
['LongUrl0.20s: Preplan Async'] 
>>> re.findall(r'LongUrl\d*.\d*.*$',b) 
['LongUrl0.20s: Preplan Async'] 

둘 다 포함 할 수있는 단일 RE를 사용할 수 있습니까?

답변

2

이유는 단지 LongUrl\d+[^<]+하지 않습니다 :

>>> import re 
>>> a = ">55.28 LongUrl0.20s: Preplan Async</a></span><br></td>" 
>>> b = "55.28 LongUrl0.20s: Preplan Async" 
>>> re.findall(r'LongUrl\d+[^<]+', a) 
['LongUrl0.20s: Preplan Async'] 
>>> re.findall(r'LongUrl\d+[^<]+', b) 
['LongUrl0.20s: Preplan Async'] 
+0

답장을 보내 주셔서 감사합니다. longUrl 문자열 다음에 숫자가 있는지 확인하고 문자열 뒤에 숫자가없는 항목을 무시해야합니다. – user2716941

+1

@ user2716941 그런 다음 질문에 답하십시오! ** 특히 ** 정규 표현식과 같은 것을 다룰 때 ** 모든 요구 사항을 제공하는 것이 중요합니다. 그게 유일한 추가 요구 사항이라면, 이것은 쉬운 수정입니다 : 위의'r'LongUrl \ d + [^ <] * ''에서 정규 표현식을 만듭니다. –

+0

@ user2716941 예, 대답을 변경했습니다 ('LongUrl' 이후의 숫자를 확인하기 위해'\ d +'포함). – alecxe

0

당신은 말했다 : ". 나는 LongUrl에서 시작 </a> 또는 줄의 끝으로 끝나는 내용을 좀하고 싶습니다"

좋아,이 정규 표현식 것 :

LongUrl(.*?)(?:</a>|$) 

이 패턴을 의미합니다. "먼저 리터럴 문자열 LongUrl 다음에 일치하는 그룹을 시작하고 일치하는 그룹 내부가 아닌 욕심 패턴을 일치하는 일치 그룹 다음에 일치하지 않는 그룹을 시작하고 일치하지 않는 그룹 내에서 </a> 또는 행의 끝에 일치시킵니다. "

공백에 일치하지 않는 패턴을 추가하여 원하는 텍스트 주위에 공백이 나타나면 공백이 잡히지 않습니다. 0 개 이상의 공백 문자를이 패턴과 쉽게 일치시킬 수 있습니다. \s*

작업 코드 샘플은 다음과 같습니다.

import re 
s_pat = r'LongUrl\s*(.*?)\s*(?:</a>|$)' 
pat = re.compile(s_pat) 
s0 = "55.28 LongUrl0.20s: Preplan Async" 
s1 = ">55.28 LongUrl0.20s: Preplan Async</a></span><br></td>" 
m = pat.search(s0) 
print(m.group(1)) # prints: 0.20s: Preplan Async 
m = pat.search(s1) 
print(m.group(1)) # prints: 0.20s: Preplan Async 
0

또한 문자열 방법을 사용할 수 있습니다 : 다른 답변에서 주석에 이어

>>> a[a.index("LongUrl"):].partition("</a>")[0] 
'LongUrl0.20s: Preplan Async' 
>>> b[b.index("LongUrl"):].partition("</a>")[0] 
'LongUrl0.20s: Preplan Async' 

을, 당신은, 예를 들어, match 위를 지정할 수 있습니다 (이 LongUrl 다음의 숫자이어야 함) 및 수행 이 :

str.isdigit(match[7]) 

하지만이 방법은 좋지 않습니다.

관련 문제