regex 在Python中查找和替换子字符串的正则表达式

n1bvdmb6  于 2023-06-30  发布在  Python
关注(0)|答案(2)|浏览(99)

对正则表达式相当陌生,需要有人给我指出正确的方向。我正在用Python编写一个程序,它从指定的用户输入中找到一个子字符串,并将该子字符串替换为用户指定的另一个字符串。我使用pandas来处理excel文件和python的re模块,它与Perl有类似的匹配。
我正在处理的文件看起来像这样:
| 服务|联系方式| Address |
| --|--| ------------ |
| 1|库克街100号| 100 Cook Street |
| 3|库克大街101号| 101 Cook ave |
| 1|库克大道102号| 102 Cook Dr |
| 1|库克苑103号| 103 Cook Court |
| 2| 104 Cook cir| 104 Cook cir |
| 2|库克大道105号| 105 Cook drive |
在地址列中,应将值标准化为100 COOK ST、101 COOK AVE、102 COOK DR、103 COOK CT等。每种街道类型(街道、大道、车道)都应缩写。
下面是reformat函数的代码:

def reformat(find, format_to):

    count = 0

    for i, row in df.iterrows():
        cell_value = df.at[i, column_header]
        #update find with regex expression
        #try an exp that will partition string and match substring at end of string
        if cell_value == re.search(r'\w+$', find):
            cell_value = str(re.search(format_to)
            count += 1
        else:
            print("No matches found...\nReturning to search...")
            __main__()
        df.at[i, column_header] = cell_value

变量findformat_to来自用户输入(在第一提供的示例中,st/str/stree/等)。将是find,ST将是format_to)。
我很难找到一个只匹配街道类型(st、rd、ave等)并只将匹配的子字符串替换为format_to的正则表达式。r'\w+$'不会识别我抛出的任何子字符串。我还需要一个正则表达式来初始赋值cell_value和将更新后的值赋值给cell_value,但还没有找到任何可行的方法。我假设初始化中的正则表达式可能与布尔语句中的正则表达式相同。
我查阅了Python的re文档和Overflow的Regex Wiki,但没有发现任何看起来可行的东西。这可能是由于缺乏理解/经验。

7uhlpewt

7uhlpewt1#

我不完全理解find是如何格式化的,但如果它是字符串"st/str/stree",这可能会奏效:

reg = rf"({'|'.join(find.split('/'))})$"
if re.search(reg, cell_value) is not None:
     cell_value = re.sub(reg, format_to, cell_value)
     count += 1

创建的正则表达式reg = r'(st|str|stree)$'匹配ststr等之一。字符串的结尾是$

7y4bm7vi

7y4bm7vi2#

我会使用一个单词字典来替换并创建一个正则表达式,然后将其传递给str.replace并使用字典来Map替换:

import re

dic = {'STREET': 'ST', 'AVENUE': 'AVE', 'COURT': 'CT', 'DRIVE': 'DR'}

# craft the regex by combining all words
# word boundary (\b) on the left, string end ($) on the right
pattern = fr"\b({'|'.join(map(re.escape, dic))})$"
# '\\b(STREET|AVENUE|COURT|DRIVE)$'

df['out'] = (df['Address'].str.upper()
             .str.replace(pattern, lambda m: dic.get(m.group()), regex=True)
            )

输出:

Site  Service          Address           out
0     1        1  100 Cook Street   100 COOK ST
1     2        3     101 Cook ave  101 COOK AVE
2     3        1      102 Cook Dr   102 COOK DR
3     4        1   103 Cook Court   103 COOK CT
4     5        2     104 Cook cir  104 COOK CIR
5     6        2   105 Cook drive   105 COOK DR

regex demo

相关问题