Làm cách nào để nhập regex trong string.replace?


317

Tôi cần một số trợ giúp về việc khai báo một regex. Đầu vào của tôi giống như sau:

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>

Đầu ra cần thiết là:

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

Tôi đã thử điều này:

#!/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

Tôi cũng đã thử điều này (nhưng có vẻ như tôi đang sử dụng cú pháp regex sai):

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

Tôi không muốn mã cứng replacetừ 1 đến 99. . .


4
Câu trả lời được chấp nhận đã bao gồm vấn đề của bạn và giải quyết nó. Bạn có cần gì nữa không ?
HamZa

Những gì nên được kết quả cho where the<[99> number ranges from 1-100</[100>?
utaccngo

nó cũng nên xóa số trong <...>thẻ, vì vậy đầu ra phải làwhere the number rangers from 1-100 ?
alvas

Câu trả lời:


565

Đoạn mã được thử nghiệm này sẽ làm điều đó:

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

Chỉnh sửa: Đây là phiên bản nhận xét giải thích cách thức hoạt động:

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)

Regexes rất vui! Nhưng tôi thực sự khuyên bạn nên dành một hoặc hai giờ để nghiên cứu những điều cơ bản. Để bắt đầu, bạn cần tìm hiểu các ký tự đặc biệt: "siêu ký tự" cần được thoát (nghĩa là dấu gạch chéo ngược được đặt ở phía trước - và các quy tắc khác nhau bên trong và bên ngoài các lớp ký tự.) Có một hướng dẫn trực tuyến tuyệt vời tại: www . thường-biểu thức.info . Thời gian bạn dành ở đó sẽ tự trả nhiều lần. Chúc mừng hạnh phúc!


vâng nó hoạt động !! cảm ơn nhưng bạn có thể giải thích ngắn gọn về regex không?
alvas

9
Cũng đừng bỏ qua Cuốn sách về các biểu thức thông thường - Làm chủ các biểu thức chính quy , bởi Jeffrey Friedl
pcurry

Một tài liệu tham khảo tốt khác thấy w3schools.com/python/python_regex.asp
Carson

38

str.replace()không thay thế cố định. Sử dụng re.sub()thay thế.


3
Cũng đáng lưu ý rằng mẫu của bạn sẽ trông giống như "</ {0-1} \ d {1-2}>" hoặc bất kỳ biến thể nào của python ký hiệu regrec sử dụng.

3
Thay thế cố định có nghĩa là gì?
avi

@avi Có lẽ ông có nghĩa là thay thế từ cố định thay vì một phần từ định vị thông qua regex.
Gunay Anach

chuỗi cố định (theo nghĩa đen, không đổi)
vstepaniuk

23

Tôi sẽ đi như thế này (regex giải thích trong các bình luận):

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)

Nếu bạn muốn tìm hiểu thêm về regex, tôi khuyên bạn nên đọc Sách dạy nấu ăn thông thường của Jan Goyvaerts và Steven Levithan.


2
Bạn chỉ có thể sử dụng *thay vì{0,}
HamZa

3
Từ các tài liệu python : {0,}giống như *, {1,}tương đương với +, và {0,1}giống như ?. Tốt hơn là sử dụng *, +hoặc ?khi bạn có thể, đơn giản vì chúng ngắn hơn và dễ đọc hơn.
winklerrr

15

Cách dễ nhất

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

Là dấu ngoặc đơn thực sự cần thiết? Đó sẽ không phải là cùng một regex : <[^>]+>? Nhân tiện: Tôi nghĩ rằng regex của bạn sẽ khớp quá nhiều (ví dụ như một cái gì đó như thế <html>)
winklerrr


3

không phải sử dụng biểu thức chính quy (cho chuỗi mẫu của bạn)

>>> 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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.