首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何准确地将逗号与正则表达式放在一起?

如何准确地将逗号与正则表达式放在一起?
EN

Stack Overflow用户
提问于 2022-04-15 18:52:47
回答 1查看 44关注 0票数 0

我是Python正则表达式中的新手。这是我的短信:

代码语言:javascript
复制
'Condition: Remanufactured Grade: Commercial Warranty: 1 Year Parts & On-Site Labor w/Ext. Ships: Fully Assembled Processing Time: Ships from our Warehouse in 2-4 Weeks

我想使用python正则表达式添加逗号,结果如下所示:

代码语言:javascript
复制
'Condition: Remanufactured ,Grade: Commercial ,Warranty: 1 Year Parts & On-Site Labor w/Ext. Ships: Fully Assembled ,Processing Time: Ships from our Warehouse in 2-4 Weeks

基本上,我希望目标词包含冒号,并希望从第二个字符串中添加逗号。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-15 20:06:25

老实说,我不会用正则表达式来解决这个问题,这在很大程度上是基于您的“处理时间”示例,这使您看起来只有知道需要解决的特定字符串才能解决问题。

代码无法神奇地知道“处理”比“完全组装”更紧密地绑定在“时间”上。

所以我看到了三种解决方案,我只想把重点放在第一种,因为我认为这是最好的一种,但我将简要地总结这三种方案:

  1. 使用一个已知字段名的列表,这会使逗号插入更加困难,并且只在逗号插入逻辑的持续时间内替换这些字符串。这将使您的逗号插入逻辑变得更简单和规则。

  1. 获取所有已知字段名的列表,并专门查找它们在它们前面插入逗号。这可能更糟,但如果名称列表没有变化,并且预期不会更改,而且大多数名称都很棘手,那么这可能会更干净。

  1. 抛出一个现代语言建模文本预测AI来解决问题:给定一个模糊字符串,如“.:完全组装处理时间:.”你基本上可以用“组装”提示你的人工智能,看看它给下一个令牌多少信任是“处理时间”,然后用“处理”提示它,看看它给下一个令牌多少信任是“时间”,然后选择它对它更有信心的那个作为你的字段名。我认为这太过分了,除非您在输入方面得到如此少的保证,所以您必须把它当作一个自然语言处理问题来处理。

所以我会做选项1,总的想法是这样的:

代码语言:javascript
复制
tricky_fields = {
    "Processing Time": "ProcessingTime",
    # add others here as needed
}
for proper_name, easier_name in tricky_fields:
    my_text = my_text.replace(f" {proper_name}: ", f" {easier_name}: ")
# do the actual comma insertions here
for proper_name, easier_name in tricky_fields:
    my_text = my_text.replace(f" {easier_name}: ", f" {proper_name}: ")

注意,我在替换的字段名周围放置了空格和冒号。如果您知道您的字段总是由类似的空格和冒号分隔,这是更好的做法,因为它不太可能自动替换不想替换的东西,因此以后不太可能成为bug的来源。

如果您的所有替换都不使用任何空格或冒号,那么逗号插入本身就会变成一个简单的正则表达式,因为您的目标只是[^ :]+:,但是regex是一种神秘的微语言,没有为人类的可读性进行优化,而且它不需要是正则表达式,因为您只需要在:上拆分,然后对每次分割的结果在最后一次拆分,然后用,,重新连接,然后重新加入整个过程:

代码语言:javascript
复制
def insert_commas(text):
    parts = text.split(":")
    new_parts = []
    for part in parts:
        most, last = part.split(" ", -1)
        new_part = " ,".join((most, last))
        new_parts.append(new_part)
    return ":".join(new_parts)

但是,如果您真的想使用regex,这里有一个简单的正则表达式,它可以实现您想要的结果:

代码语言:javascript
复制
def insert_commas(text):
    return re.sub(' ([^ :]+: )', r' ,\1', text)

尽管在实际的生产代码中,我会改进棘手的字段替换,方法是将两个替换分解成一个单独的可测试函数,并使用一些bidict来代替常规字典,如下所示:

代码语言:javascript
复制
from bidict import bidict

tricky_fields = bidict({
    "Processing Time": "ProcessingTime",
    # add others here as needed
})

def replace_fields(names, text):
    for old_name, new_name in names:
        text = text.replace(f" {old_name}: ", f" {new_name}: ")
    return text

使用bidict和专用函数更清晰、更自我描述、更易于维护、更少的代码保持一致,而且更容易测试/验证,甚至可以避免将两个棘手的字段名意外地映射到相同的替换字段,从而获得一些运行时安全性。

因此,将前两个代码块组合在一起:

代码语言:javascript
复制
text = replace_fields(tricky_fields, text)
text = insert_commas(text)
text = replace_fields(tricky_fields.inverse, text)

当然,如果您不需要进行第二个替换来撤消初始替换,您可以将其保留为-在完成逗号插入之后。不管是哪种方式,这种方法都是将逗号问题从棘手的名称问题中分解出来的,这使得逗号问题变得更加困难/复杂。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71887831

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档