string.replace에 정규식을 입력하는 방법은 무엇입니까?


317

정규식 선언에 도움이 필요합니다. 내 입력은 다음과 같습니다.

this is a paragraph with<[1> in between</[1> and then there are cases ... where the<[99> number ranges from 1-100</[99>. 
and there are many other lines in the txt files
with<[3> such tags </[3>

필요한 출력은 다음과 같습니다.

this is a paragraph with in between and then there are cases ... where the number ranges from 1-100. 
and there are many other lines in the txt files
with such tags

나는 이것을 시도했다 :

#!/usr/bin/python
import os, sys, re, glob
for infile in glob.glob(os.path.join(os.getcwd(), '*.txt')):
    for line in reader: 
        line2 = line.replace('<[1> ', '')
        line = line2.replace('</[1> ', '')
        line2 = line.replace('<[1>', '')
        line = line2.replace('</[1>', '')

        print line

나는 이것을 시도했지만 (잘못된 정규 표현식 구문을 사용하고있는 것 같습니다)

    line2 = line.replace('<[*> ', '')
    line = line2.replace('</[*> ', '')
    line2 = line.replace('<[*>', '')
    line = line2.replace('</[*>', '')

replace1에서 99까지 하드 코딩하고 싶지 않습니다 . . .


4
수락 된 답변은 이미 문제를 다루고 해결합니다. 다른 게 필요 하신가요?
HamZa

결과는 where the<[99> number ranges from 1-100</[100>어떻습니까?
utapyngo 2016 년

또한 <...>태그 의 숫자를 제거해야 합니다. 출력은 다음과 같아야합니다.where the number rangers from 1-100 ?
alvas

답변:


565

이 테스트 된 스 니펫은 다음을 수행해야합니다.

import re
line = re.sub(r"</?\[\d+>", "", line)

편집 : 작동 방식을 설명하는 주석이 달린 버전이 있습니다.

line = re.sub(r"""
  (?x) # Use free-spacing mode.
  <    # Match a literal '<'
  /?   # Optionally match a '/'
  \[   # Match a literal '['
  \d+  # Match one or more digits
  >    # Match a literal '>'
  """, "", line)

정규식은 재미있다! 그러나 기초를 공부하는 데 1 ~ 2 시간을 보내는 것이 좋습니다. 우선, 어떤 캐릭터가 특별한 지 배워야합니다. "메타 캐릭터 " 이스케이프 처리해야합니다 (즉, 백 슬래시가 앞에 배치되고 규칙은 내부와 외부의 클래스가 다릅니다). www. .regular-expressions.info . 당신이 그곳에서 보내는 시간은 여러 번에 걸쳐 스스로를 지불 할 것입니다. 행복한 정규식!


works 작동합니다 !! 고맙지 만 정규식을 간단하게 설명 할 수 있습니까?
alvas

9
또한 정규 표현식에 관한 책- 정규 표현식 마스터하기 , Jeffrey Friedl
pcurry

또 다른 좋은 참고 자료는 w3schools.com/python/python_regex.asp를
Carson

38

str.replace()고정 교체를 수행합니다. re.sub()대신 사용하십시오 .


3
또한 패턴이 "</ {0-1} \ d {1-2}>"또는 정규식 표기법 파이썬이 사용하는 모든 변형과 비슷해야합니다.

3
고정 교체는 무엇을 의미합니까?
avi

@avi 아마 그는 정규 표현식을 통해 부분 단어를 찾는 고정 단어 대체를 의미했습니다.
Gunay Anach

고정 (문자, 상수) 문자열
vstepaniuk

23

나는 이것을 좋아할 것이다.

import re

# If you need to use the regex more than once it is suggested to compile it.
pattern = re.compile(r"</{0,}\[\d+>")

# <\/{0,}\[\d+>
# 
# Match the character “<” literally «<»
# Match the character “/” literally «\/{0,}»
#    Between zero and unlimited times, as many times as possible, giving back as needed (greedy) «{0,}»
# Match the character “[” literally «\[»
# Match a single digit 0..9 «\d+»
#    Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+»
# Match the character “>” literally «>»

subject = """this is a paragraph with<[1> in between</[1> and then there are cases ... where the<[99> number ranges from 1-100</[99>. 
and there are many other lines in the txt files
with<[3> such tags </[3>"""

result = pattern.sub("", subject)

print(result)

정규식에 대한 자세한 내용을 보려면 Jan Goyvaerts와 Steven Levithan의 Regular Expressions Cookbook 을 읽는 것이 좋습니다.


2
당신은 *대신 사용할 수 있습니다{0,}
HamZa

3
로부터 파이썬 문서 : {0,}와 동일 *, {1,}동등 +{0,1}동일하다 ?. 그것은 사용하는 것이 좋습니다 *, +또는 ?때 당신이 할 수있는 그들이 짧고 쉽게 읽을 수있어 간단하기 때문에.
winklerrr

15

가장 쉬운 방법

import re

txt='this is a paragraph with<[1> in between</[1> and then there are cases ... where the<[99> number ranges from 1-100</[99>.  and there are many other lines in the txt files with<[3> such tags </[3>'

out = re.sub("(<[^>]+>)", '', txt)
print out

괄호가 정말로 필요한가요? 그것은 같은 정규 표현식이 <[^>]+>아닐까요? 그런데 : 나는 당신의 정규식이 너무 많은 (같은 예를 들어 뭔가를 일치합니다 생각 <html>)
winklerrr


3

정규식을 사용할 필요가 없습니다 (샘플 문자열에 대해)

>>> s
'this is a paragraph with<[1> in between</[1> and then there are cases ... where the<[99> number ranges from 1-100</[99>. \nand there are many other lines in the txt files\nwith<[3> such tags </[3>\n'

>>> for w in s.split(">"):
...   if "<" in w:
...      print w.split("<")[0]
...
this is a paragraph with
 in between
 and then there are cases ... where the
 number ranges from 1-100
.
and there are many other lines in the txt files
with
 such tags

3
import os, sys, re, glob

pattern = re.compile(r"\<\[\d\>")
replacementStringMatchesPattern = "<[1>"

for infile in glob.glob(os.path.join(os.getcwd(), '*.txt')):
   for line in reader: 
      retline =  pattern.sub(replacementStringMatchesPattern, "", line)         
      sys.stdout.write(retline)
      print (retline)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.