【问题标题】:Removing whitespaces using regex python使用正则表达式 python 删除空格
【发布时间】:2020-09-03 13:02:53
【问题描述】:

我正在尝试修改文件的每一行以删除以字符 '(' 开头或在方括号中包含数字/字符 ie'[2] 的任何部分强>':

f = open('/Users/name/Desktop/university_towns.txt',"r")
listed = []
import re 
for i in f.readlines():
    if i.find(r'\(.*?\)\n'): 
       here = re.sub(r'\(.*?\)\[.*?\]\n', "", i)
       listed.append(here)
    elif i.find(r' \(.*?\)\n'):
       here = re.sub(r' \(.*?\)\[.*?\]\n', "", i)
       listed.append(here)
    elif i.find(r' \[.*?\]\n'): 
       here = re.sub(r' \[.*?\]\n', "", i)
       listed.append(here) 
    else:
       here = re.sub(r'\[.*?\]\n', "", i)
       listed.append(here)

我的输入数据的样本

Platteville (University of Wisconsin–Platteville)[2]
River Falls (University of Wisconsin–River Falls)[2]
Stevens Point (University of Wisconsin–Stevens Point)[2]
Waukesha (Carroll University)
Whitewater (University of Wisconsin–Whitewater)[2]
Wyoming[edit]
Laramie (University of Wyoming)[5]

我的输出数据示例:

Platteville 
River Falls 
Stevens Point 
Waukesha (Carroll University)
Whitewater 
Wyoming[edit]
Laramie 

但是,我不想要“(卡罗尔大学)”或“[编辑]”等部分。

我如何修改我的公式

如果有人能给我任何建议,我将不胜感激!

【问题讨论】:

  • 为什么在此处标记pandas?看不出与该问题有多大相关性。
  • @MayankPorwal 抱歉让您不高兴了!它已被删除:)

标签: python list loops replace


【解决方案1】:

你可以这样做:

import re 

with open(ur_file) as f_in:
    for line in f_in:
        if m:=re.search(r'^([^([]+)', line):  # Python 3.8+
            print(m.group(1))

如果您的 Python 是 3.8 之前的版本,但没有 Walrus

with open(ur_file) as f_in:
    for line in f_in:
        m=re.search(r'^([^([]+)', line)
        if m:
            print(m.group(1))

打印:

Platteville 
River Falls 
Stevens Point 
Waukesha 
Whitewater 
Wyoming
Laramie 

正则表达式解释:

^([^([]+)

^                            start of the line
 ^       ^                   capture group
   ^   ^                     character class
     ^                       class of characters OTHER THAN ( and [
        ^                    + means one or more

Here is the regex on Regex101

【讨论】:

  • 您能否更详细地解释一下这意味着什么:r'^([^([]+)'
  • 如此有效地表示 () 或 [] 中的一个或多个不是“()”或“[]”的字符
  • [] 定义了里面的字符的一个字符类。如果您添加 [^] 否定里面的内容。所以[^(] 是除( 之外的单个字符。现在添加一个repletion 运算符,您将得到一个字符串,而不是否定字符类中的字符。所以[^([]+ 是直到([ 的所有字符。
  • 如果我将 m.group(1) 存储为变量,here = print(m.group(1)) 然后 print(here) 在列表底部返回 None 。我怎样才能删除它?
  • here = print(m.group(1)) 没有存储m.group(1)。它正在存储print 的结果,即None
【解决方案2】:

改用这个正则表达式:

\(.*\)|\[.*\]

像这样:

re.sub(r'\(.*\)|\[.*\]', '', i)

这将替换括号中的任何内容 (\(.*\)) 或 (|) 方括号中的任何内容 (\[.*\])

【讨论】:

    【解决方案3】:

    如果在比循环更快、更易读的矢量化解决方案之后。那就试试吧;

    数据

    df=pd.DataFrame({'text':['Platteville (University of Wisconsin–Platteville)[2]','River Falls (University of Wisconsin–River Falls)[2]','Stevens Point (University of Wisconsin–Stevens Point)[2]','Waukesha (Carroll University)','Whitewater (University of Wisconsin–Whitewater)[2]','Wyoming[edit]','Wyoming[edit]']})
    

    正则表达式提取

    df['name']=df.text.str.extract('([A-Za-z\s+]+(?=\(|\[))')
    

    正则表达式分解

    捕获任何[A-Za-z\s+]大写、小写字母后跟空格

    (?=\(|\[)) 后面紧跟特殊字符(` 或特殊字符 [

    【讨论】:

    • 非常感谢!如何为打开的文本文件(而不是数据框)的每一行执行此操作?
    • 如果是这样的话,for循环应该没问题
    • 你看到这个公式中的第二个加号'([A-Za-z\s+]+(?=(|[))',我说这意味着一个或多个是正确的吗'[A-Za-z\s+]' 的出现?换句话说,第二个加号的需要是什么?
    • 我认为 Pandas 中的字符串方法并不比普通 python 中的快。数字是的,但字符串我认为 python 更快。
    猜你喜欢
    • 2011-11-01
    • 2012-11-15
    • 2021-04-10
    • 1970-01-01
    • 2020-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多