IT이야기

내부의 모든 줄 바꿈 문자(\n)와 일치하는 정규식

cyworld 2021. 10. 14. 21:15
반응형

내부의 모든 줄 바꿈 문자(\n)와 일치하는 정규식 꼬리표


나는 모든 새 라인 문자 (일치하는 정규 표현식을 찾고 \n있는 XML 태그 내부) <content>, 또는 그 안에있는 태그 내부에 <content>예를 들어, 태그 :

<blog>
<text>
(Do NOT match new lines here)
</text>
<content>
(DO match new lines here)
<p>
(Do match new lines here)
</p>
</content>
(Do NOT match new lines here)
<content>
(DO match new lines here)
</content>

실제로 ... 여기에서는 간단한 정규식을 사용할 수 없습니다. 적어도 하나는 사용하지 마십시오. 당신은 아마 댓글에 대해 걱정해야 할 것입니다! 누군가 다음과 같이 쓸 수 있습니다.

<!-- <content> blah </content> -->

여기에서 두 가지 접근 방식을 취할 수 있습니다.

  1. 먼저 모든 주석을 제거하십시오. 그런 다음 정규식 접근 방식을 사용하십시오.
  2. 정규식을 사용하지 말고 주석에 내포되어 있는지 여부를 추적할 수 있는 상황에 맞는 구문 분석 방식을 사용하십시오.

조심하세요.

또한 모든 새 라인을 한 번에 일치시킬 수 있는지 확신할 수 없습니다. @Quartz는 다음을 제안했습니다.

<content>([^\n]*\n+)+</content>

이것은 닫기 태그 바로 앞에 줄 바꿈 문자가 있는 모든 콘텐츠 태그와 일치하지만... 모든 줄 바꿈과 일치한다는 것이 무슨 뜻인지 잘 모르겠습니다 . 일치하는 모든 개행 문자에 액세스할 수 있기를 원하십니까? 그렇다면 가장 좋은 방법은 모든 콘텐츠 태그를 가져온 다음 그 사이에 중첩된 모든 개행 문자를 검색하는 것입니다. 이것과 같은 것 :

<content>.*</content>

하지만 한 가지 주의할 점이 있습니다. 정규식은 욕심을 부리기 때문에 이 정규식은 첫 번째 여는 태그와 마지막으로 닫는 태그를 일치시킵니다. 대신 탐욕스럽지 않도록 정규식을 억제해야 합니다. 파이썬과 같은 언어에서는 "?" 정규식 기호.

이를 통해 몇 가지 함정을 확인하고 진행 방법을 파악할 수 있기를 바랍니다. XML 구문 분석 라이브러리를 사용한 다음 모든 콘텐츠 태그를 반복하는 것이 더 나을 것입니다.

제가 최선의 해결책을 제시하지 못할 수도 있다는 것을 압니다만, 적어도 이것의 어려움과 다른 답변이 옳지 않은 이유를 알기를 바랍니다...

업데이트 1:

조금 더 요약하고 내 답변에 더 자세한 내용을 추가하겠습니다. 나는 파이썬의 정규식 구문을 사용할 것입니다. 왜냐하면 그것이 제가 더 익숙하기 때문입니다.

주석을 제거하려면 다음 정규식을 사용하십시오. "?" 욕심을 부리지 않도록 .*를 억제합니다.

마찬가지로 콘텐츠 태그를 검색하려면 다음을 사용하십시오. .*?

또한 이것을 시도하고 일치 개체 groups()를 사용하여 각 개행 문자에 액세스할 수 있습니다.

<content>(.*?(\n))+.*?</content>

내 탈출이 꺼져 있다는 것을 알고 있지만 아이디어를 포착합니다. 이 마지막 예는 작동하지 않을 수 있지만 원하는 것을 표현하는 데 가장 좋은 방법이라고 생각합니다. 내 제안은 남아 있습니다. 모든 콘텐츠 태그를 가져와 직접 수행하거나 구문 분석 라이브러리를 사용합니다.

업데이트 2:

여기 작동해야 하는 파이썬 코드가 있습니다. 나는 여전히 모든 개행 문자를 "찾기"한다는 것이 무엇을 의미하는지 잘 모르겠습니다. 전체 라인을 원하십니까? 또는 얼마나 많은 개행 문자를 계산하기 위해. 실제 행을 얻으려면 다음을 시도하십시오.

#!/usr/bin/python

import re

def FindContentNewlines(xml_text):
    # May want to compile these regexes elsewhere, but I do it here for brevity
    comments = re.compile(r"<!--.*?-->", re.DOTALL)
    content = re.compile(r"<content>(.*?)</content>", re.DOTALL)
    newlines = re.compile(r"^(.*?)$", re.MULTILINE|re.DOTALL)

    # strip comments: this actually may not be reliable for "nested comments"
    # How does xml handle <!--  <!-- --> -->. I am not sure. But that COULD
    # be trouble.
    xml_text = re.sub(comments, "", xml_text)

    result = []
    all_contents = re.findall(content, xml_text)
    for c in all_contents:
        result.extend(re.findall(newlines, c))

    return result

if __name__ == "__main__":
    example = """

<!-- This stuff
ought to be omitted
<content>
  omitted
</content>
-->

This stuff is good
<content>
<p>
  haha!
</p>
</content>

This is not found
"""
    print FindContentNewlines(example)

이 프로그램은 결과를 인쇄합니다.

 ['', '<p>', '  haha!', '</p>', '']

The first and last empty strings come from the newline chars immediately preceeding the first <p> and the one coming right after the </p>. All in all this (for the most part) does the trick. Experiment with this code and refine it for your needs. Print out stuff in the middle so you can see what the regexes are matching and not matching.

Hope this helps :-).

PS - I didn't have much luck trying out my regex from my first update to capture all the newlines... let me know if you do.


<content>(?:[^\n]*(\n+))+</content>

ReferenceURL : https://stackoverflow.com/questions/1117807/regular-expression-to-match-every-new-line-character-n-inside-a-content-tag

반응형