문제

이봐, 나는 정규 표현에 대해 상당히 기본적인 질문이 있습니다. 바디 태그 내부 (및 포함) 텍스트를 반환하고 싶습니다. 오프닝 바디 태그 전에 모든 캐릭터와 일치하기 때문에 다음이 옳지 않다는 것을 알고 있습니다. 나는 당신이 그것들을 어떻게 건너 뛰는 지 궁금합니다.

x = re.match('(.*<body).*?(</body>)', fileString)

감사!

도움이 되었습니까?

해결책

다음은 Regex를 사용하여 사이의 모든 텍스트를 찾는 몇 가지 예제 코드입니다. <body>...</body> 태그. 이것은 Python의 Re 모듈의 일부 기능을 보여 주지만 아름다운 수프 모듈은 사용하기가 매우 쉽고 HTML 또는 XML을 구문 분석 할 경우 사용하기에 더 나은 도구입니다. (BeautifulSoup을 사용하여 이것을 구문 분석 할 수있는 방법의 예는 아래를 참조하십시오.)

#!/usr/bin/env python
import re

# Here we have a string with a multiline <body>...</body>
fileString='''baz<body>foo
baby foo
baby foo
baby foo
</body><body>bar</body>'''

# re.DOTALL tells re that '.' should match any character, including newlines.
x = re.search('(<body>.*?</body>)', fileString, re.DOTALL)
for match in x.groups():
    print(match)
# <body>foo
# baby foo
# baby foo
# baby foo
# </body>

모든 경기를 수집하려면 Re.findall을 사용할 수 있습니다.

print(re.findall('(<body>.*?</body>)', fileString, re.DOTALL))
# ['<body>foo\nbaby foo\nbaby foo\nbaby foo\n</body>', '<body>bar</body>']

이 패턴을 두 번 이상 사용할 계획이라면 미리 컴파일 할 수 있습니다.

pat=re.compile('(<body>.*?</body>)', re.DOTALL)
print(pat.findall(fileString))
# ['<body>foo\nbaby foo\nbaby foo\nbaby foo\n</body>', '<body>bar</body>']

그리고 다음은 BeautifulSoup과 함께 할 수있는 방법입니다.

#!/usr/bin/env python
from BeautifulSoup import BeautifulSoup

fileString='''baz<body>foo
baby foo
baby foo
baby foo
</body><body>bar</body>'''
soup = BeautifulSoup(fileString)
print(soup.body)
# <body>foo
# baby foo
# baby foo
# baby foo
# </body>

print(soup.findAll('body'))
# [<body>foo
# baby foo
# baby foo
# baby foo
# </body>, <body>bar</body>]

다른 팁

나는 파이썬을 모른다. 그러나 여기에 함께 버린 간단한 예가있다. 아름다운 수프, 파이썬 HTML 구문 분석에 종종 권장되는 것을 볼 수 있습니다.

import BeautifulSoup

soup = BeautifulSoup(fileString)

bodyTag = soup.html.body.string

(이론적으로) HTML의 모든 복잡성을 다룰 것이며, 이는 Regex가 설계된 것이 아니기 때문에 순수한 Regex 기반 답변으로는 매우 어렵습니다.

REGEX와 함께 HTML을 구문 분석 할 수 없습니다. HTML은 일반 언어가 아닙니다. 대신 LXML과 같은 HTML 파서를 사용하십시오.

 x = re.match('.*(<body>.*?</body>)', fileString)

HTML 파싱을 위해 Minidom을 고려하십시오.

x = re.search('(<body>.*</body>)', fileString)
x.group(1)

경기 답변보다 타이핑이 적습니다

파이스트링에 포함되어 있습니다 여러 줄? 이 경우 명시 적으로 라인을 지정하거나 건너 뛰어야 할 수도 있습니다.

x = re.match(r"(?:.|\n)*(<body>(?:.|\n)*</body>)", fileString)

또는 더 간단히 RE 모듈을 사용합니다.

x = re.match(r".*(<body>.*</body>)", fileString, re.DOTALL)

x.groups()[0] x가 없다면 문자열을 포함해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top