output = input_text.replace('una', '1')

它应该用字符串"1"but only in certain cases替换子字符串"una".问题是,我很难找到指定的正则表达式模式或模式的串联,这些模式允许我们获得这些"una"x"1"的替换.

在这里,我添加了9个此正则表达式应该运行的示例

#example 1
input_text = "ashashj a la una y una jhasjhdjhas" #input
output = "ashashj a la 1 y 1 jhasjhdjhas" #the expected output string

#example 2
input_text = "ajshdjhas a las una y una hsdhjds"
output = "ajshdjhas a las 1 y 1 hsdhjds"

#example 3
input_text = "A la una y cuarto  hjjhhj"
output = "A la 1 y cuarto  hjjhhj"

#example 4
input_text = "a las una y media hjjhsssshj"
output = "a las 1 y media hjjhsssshj"

#example 5
input_text = "A la una y menos cuarto  hjjhhj"
output = "A la 1 y menos cuarto  hjjhhj"

#example 6
input_text = "A las una en punto ashjs"
output = "A las 1 en punto ashjs"

#example 7
input_text = "asas a la una en punto ajs"
output = "asas a la 1 en punto ajs"

#example 8
input_text = "hay que colocar una buena antena... algunas ya estaran entre la una y las una y media, pero con estar a eso de la una y una esta bien para alguna. A eso de la una! deberia estar como mucho a la una y poco mas, almenos una de ellas"
output = "hay que colocar una buena antena... algunas ya estaran entre la 1 y las 1 y media, pero con estar a eso de la 1 y 1 esta bien para alguna. A eso de la 1! deberia estar como mucho a la 1 y poco mas, almenos una de ellas"

#example 9
input_text = "unas o algunas de ellas, ya estan entre la una, cerca de la una y las una y media, pero con estar a eso de la una; esta bien para llegar temprano, pero no quiero pasarme de la una y una."
output = "unas o algunas de ellas, ya estan entre la 1, cerca de la 1 y las 1 y media, pero con estar a eso de la 1; esta bien para llegar temprano, pero no quiero pasarme de la 1 y 1."

我已经想过用两种正则表达式模式来做这件事,也许是这样的…

r"(a las|a la|:)\s*una"

然后这个图案

r"una\s*(y cuarto|y media|y menos cuarto|menos cuarto|:)"

if至少one of them is true……然后用"1"替换"una"

推荐答案

这是一个有趣的问题,因为它需要一些高级的调整来解决它.让我们首先创建一些自动测试(这不是unit-test,但您可以很容易地从它创建一个):

input_text = ["ashashj a la una y una jhasjhdjhas",
              "ajshdjhas a las una y una hsdhjds",
              "A la una y cuarto  hjjhhj",
              "a las una y media hjjhsssshj",
              "A la una y menos cuarto  hjjhhj",
              "A las una en punto ashjs",
              "asas a la una en punto ajs",
              "hay que colocar una buena antena... algunas ya estaran entre la una y las una y media, pero con estar a eso de la una y una esta bien para alguna. A eso de la una! deberia estar como mucho a la una y poco mas, almenos una de ellas",
              "unas o algunas de ellas, ya estan entre la una, cerca de la una y las una y media, pero con estar a eso de la una; esta bien para llegar temprano, pero no quiero pasarme de la una y una."]

output = ["ashashj a la 1 y 1 jhasjhdjhas",
          "ajshdjhas a las 1 y 1 hsdhjds",
          "A la 1 y cuarto  hjjhhj",
          "a las 1 y media hjjhsssshj",
          "A la 1 y menos cuarto  hjjhhj",
          "A las 1 en punto ashjs",
          "asas a la 1 en punto ajs",
          "hay que colocar una buena antena... algunas ya estaran entre la 1 y las 1 y media, pero con estar a eso de la 1 y 1 esta bien para alguna. A eso de la 1! deberia estar como mucho a la 1 y poco mas, almenos una de ellas",
          "unas o algunas de ellas, ya estan entre la 1, cerca de la 1 y las 1 y media, pero con estar a eso de la 1; esta bien para llegar temprano, pero no quiero pasarme de la 1 y 1."]

for ogl, des in zip(input_text, output):
    txt = re.sub(pattern, "1", ogl)
    assert(txt == des)

现在,我们只需遍历这些示例和assert,证明它们是相等的.如果没有引发错误,那么您已经定义了一个合适的模式.剩下的唯一需要定义的是pattern.

这就是先进的思维:

  • 我们只想替换所有出现的字符序列"una"but
  • 如果前面是"la ""las ""y "(始终带有widespace),则为and
  • 后跟宽空格、句尾字符(. ! ?)或分句符号(, ; :)--请注意,其中许多字符需要转义,因为它们用于指示特殊模式)

让我们把它放入一个模式中:

pattern = "(?<=((las?)|(y))\s)una(?=[\.\?\!\:,;\s])"

我们可以将第二个要求转换为"((las?)|(y))\s)",但诀窍是使用"(?<=...)"来表示所需的字符序列的未使用的前瞻preceding.问题是the standard 102-package cannot cope with such a look-ahead if it is of variable length!(即,如果您使用?|).加载高级regex包(请注意,您需要通过pip install regex安装它):import regex as re

第三个要求可以利用图案(?=[\.\?\!\:,;\s])来实现,该图案(?=[\.\?\!\:,;\s])再次产生所需序列的前瞻after.同样,它不使用字符串,该字符串简单地表示它需要这些字符出现在字符串中,但它们不会被替换.

为简洁起见,将整个代码放在一个框中:

import re

input_text = ["ashashj a la una y una jhasjhdjhas",
              "ajshdjhas a las una y una hsdhjds",
              "A la una y cuarto  hjjhhj",
              "a las una y media hjjhsssshj",
              "A la una y menos cuarto  hjjhhj",
              "A las una en punto ashjs",
              "asas a la una en punto ajs",
              "hay que colocar una buena antena... algunas ya estaran entre la una y las una y media, pero con estar a eso de la una y una esta bien para alguna. A eso de la una! deberia estar como mucho a la una y poco mas, almenos una de ellas",
              "unas o algunas de ellas, ya estan entre la una, cerca de la una y las una y media, pero con estar a eso de la una; esta bien para llegar temprano, pero no quiero pasarme de la una y una."]

output = ["ashashj a la 1 y 1 jhasjhdjhas",
          "ajshdjhas a las 1 y 1 hsdhjds",
          "A la 1 y cuarto  hjjhhj",
          "a las 1 y media hjjhsssshj",
          "A la 1 y menos cuarto  hjjhhj",
          "A las 1 en punto ashjs",
          "asas a la 1 en punto ajs",
          "hay que colocar una buena antena... algunas ya estaran entre la 1 y las 1 y media, pero con estar a eso de la 1 y 1 esta bien para alguna. A eso de la 1! deberia estar como mucho a la 1 y poco mas, almenos una de ellas",
          "unas o algunas de ellas, ya estan entre la 1, cerca de la 1 y las 1 y media, pero con estar a eso de la 1; esta bien para llegar temprano, pero no quiero pasarme de la 1 y 1."]

for ogl, des in zip(input_text, output):
    txt = re.sub("(?<=((las?)|(y))\s)una(?=[\.\?\!\:,;\s])", "1", ogl)
    assert(txt == des)

因为它不会抛出错误,所以它适合您的所有示例.

Python相关问答推荐

如何计算两极打印机中 * 所有列 * 的出现次数?

大Pandas 胚胎中产生组合

追溯(最近最后一次调用):文件C:\Users\Diplom/PycharmProject\Yolo01\Roboflow-4.py,第4行,在模块导入roboflow中

按列分区,按另一列排序

如何访问所有文件,例如环境变量

Pandas 都是(),但有一个门槛

根据二元组列表在pandas中创建新列

对所有子图应用相同的轴格式

把一个pandas文件夹从juyter笔记本放到堆栈溢出问题中的最快方法?

有没有一种ONE—LINER的方法给一个框架的每一行一个由整数和字符串组成的唯一id?

Pandas Data Wrangling/Dataframe Assignment

重置PD帧中的值

如何在海上配对图中使某些标记周围的黑色边框

使用字典或列表的值组合

在用于Python的Bokeh包中设置按钮的样式

从一个df列提取单词,分配给另一个列

.awk文件可以使用子进程执行吗?

具有不同坐标的tkinter canvs.cocords()和canvs.moveto()

删除另一个div中的特定div容器

如何让PYTHON上的Selify连接到现有的Firefox实例-我无法连接到Marionette端口