두 패턴 사이의 문자열을 가져오는 중 오류가 발생했습니다.

두 패턴 사이의 문자열을 가져오는 중 오류가 발생했습니다.

두 패턴 사이에 문자열을 가져오고 싶습니다. 모드는 <p> </p>html 파일의 첫 번째 환경입니다.

<p>Sorcery, 
          R (1)
          </p>
        <p class="ctext"><b>As an additional cost to cast Goblin Grenade, sacrifice a Goblin.<br><br>Goblin Grenade deals 5 damage to target creature or player.</b></p>


      <p><i>Don't underestimate the aerodynamic qualities of the common goblin.</i></p>
      <p>Illus. Kev Walker</p>

환경이 파일의 첫 번째이므로 <p>이전까지 일치하는 항목을 모두 삭제하고 </p>.

name="goblin grenade"
wget -O- http://magiccards.info/query?q="$name" | grep -oP '<p>\K[^<]+'

왜 제대로 작동하지 않는지 모르겠습니다. 알겠어요

Sorcery, 
Illus. Kev Walker

답변1

HTML을 구문 분석하는 데 정규식을 사용하지 말고 대신 적절한 HTML 구문 분석기를 사용하십시오.

이론:

컴파일 이론에 따르면 HTML은 정규식 기반 구문 분석을 사용할 수 없습니다.유한 상태 머신. HTML의 계층 구조로 인해 다음을 사용해야 합니다.푸시다운 오토마톤조작하고왼손잡이 수용체도구와 유사한 구문 사용아크릴.

realLife©®™ 일상 도구:

대신, 올바른 작업에 적합한 도구를 사용해야 합니다.

...이건 직업이야:

통과문자열 일치:

string="Sorcery"
xmllint --html --xpath "//p[contains(text(), '$string')]/text()" file_or_URL

N번째 <p>노드를 통해(여기서 N은 1임):

xmllint --html --xpath "//p[1]/text()" file_or_URL

확인하다https://stackoverflow.com/questions/1732348/regex-match-open-tags-book-xhtml-self-contained-tags

답변2

부인 성명:

@sputnick의 답변은 분명히 올바른 접근 방식입니다. (저는 xmllint를 좋아합니다. 여러 XML/HTML 작업에 사용합니다. xpath 옵션에 대해 가르쳐주셔서 감사합니다!!)

그러나 일회성 스크립팅에는 덜 강력한 다른 기술도 유용합니다.

정규식을 사용하여 첫 번째 단락 가져오기(Perl)

perl -n0e 'm!<p.*?>(.*?)</p>!s   and print $1'

\n또는 ' '을 (를) 제거하려는 경우

perl -n0e 'm!<p.*?>(.*?)</p>!s   and print $1 =~ s/\n//gr'

관련 정보