Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中使用正则表达式在数字数量值前后添加数量标识符_Python_Regex_Regex Lookarounds_Regex Group_Re - Fatal编程技术网

在Python中使用正则表达式在数字数量值前后添加数量标识符

在Python中使用正则表达式在数字数量值前后添加数量标识符,python,regex,regex-lookarounds,regex-group,re,Python,Regex,Regex Lookarounds,Regex Group,Re,我在Python中使用正则表达式在数字数量值前后添加数量标识符 基本上,我必须添加QtyOrd和Units单词,它不在文本中的数字数量之后 例如: 'PartNo-001A description 20 units some other description' => 'PartNo-001A description QtyOrd 20 units some other description' 'PartNo-001A description QtyOrd 20 some other d

我在Python中使用正则表达式在数字数量值前后添加数量标识符

基本上,我必须添加QtyOrdUnits单词,它不在文本中的数字数量之后

例如:

'PartNo-001A description 20 units some other description' => 'PartNo-001A description QtyOrd 20 units some other description'
'PartNo-001A description QtyOrd 20 some other description' => 'PartNo-001A description QtyOrd 20 units some other description'
'PartNo-001A description QtyOrd 20' => 'PartNo-001A description QtyOrd 20 units'
'PartNo-001A QtyOrd 20' => 'PartNo-001A QtyOrd 20 units'
'PartNo-001A 20 units'=> 'PartNo-001A QtyOrd 20 units'
我使用的代码如下:

重新导入
def过程(文本):
对于有关findall的x((qtyord[0-9]+单位|[0-9]+单位| qtyord[0-9]+| qtyord[0-9]+单位),text.lower()):
Text_mediate=“OrderQty”+str(重新搜索(“[0-9]+”,x).group())+“单位”
Text|u Final=re.sub((qtyord[0-9]+单位|[0-9]+单位| qtyord[0-9]+| qtyord[0-9]+单位),Text|中间,Text,flags=re.IGNORECASE)
返回最终文本
text1='零件号-001A说明20个单元其他说明'
text2=''
请您将机票重新定向到正确的销售部门,以便他们能够提供帮助和项目报价
在下面
QtyOrd 20个单元其他描述
''' 
text3='零件号-001A说明QtyOrd 20一些其他说明'
text4=‘零件号-001A说明QtyOrd 20’
text 5='零件号-001A QtyOrd 20'
text6='零件号-001A 20个单元'
text7=''
请您将机票重新定向到正确的销售部门,以便他们能够提供帮助和项目报价
在下面
QtyOrd 20装置一些其他说明零件号-001A
''' 
text8=''
请您将机票重新定向到正确的销售部门,以便他们能够提供帮助和项目报价
在下面
零件号-001A
克特约德
20
''' 
然后:

对于
text8
代码不起作用。 你能帮我解决这个问题吗

输出应如下所示:

1。零件号001A说明QtyOrd 20装置其他说明
2.请您将机票重新定向到正确的销售部门,以便他们能够提供帮助和项目报价
在下面
QtyOrd 20个单元其他描述
3.零件号001A说明QtyOrd 20装置其他说明
4.零件号-001A说明QtyOrd 20装置
5.零件号001A QtyOrd 20装置
6.零件号001A QtyOrd 20装置
7.请您将机票重新定向到正确的销售部门,以便他们能够提供帮助和项目报价
在下面
QtyOrd 20装置一些其他说明零件号-001A
8.请您将机票重新定向到正确的销售部门,以便他们能够提供帮助和项目报价
在下面
零件号-001A
克特约德
20
单位
您可以使用

import re
text = r'PartNo-001A description 20 units some other description'
pattern = re.compile(r'\b(?:qtyord\s*(\d+)(?:\s*units)?|(\d+)\s*units)\b', re.I)
Text_Final = pattern.sub(r'QtyOrd \1\2 units', text)
print(Text_Final)
# => PartNo-001A description QtyOrd 20 units some other description
请参阅和

详情:

  • \b
    -单词边界
  • (?:
    -启动非捕获组
    • qtyord
    • \s*
      -零个或多个空格
    • (\d+)
      -第1组(用替换模式中的
      \1
      表示):一个或多个数字
    • (?:\s*单位)?
      -一个可选组,匹配零个或多个空格和
      单位
      字(如果您还想匹配
      单位
      ,请在
      后添加
  • |
    -或
    • (\d+)
      -第2组(用替换模式中的
      \2
      引用):一个或多个数字
    • \s*单位
      -零个或多个空格和
      单位
      字(如果您还希望以单数形式匹配
      单位
      ,请在
      后添加
  • -组结束
  • \b
    -单词边界

假设text8的预期结果为
订购数量20件
, 不超过20个单位,请尝试:

def process_QtyOrd(text):
    m = re.match(r'^(.*?)(qtyord\s*\d+\s*units|\d+\s+units|qtyord\s+\d+)(.*)$', text, flags=re.IGNORECASE|re.DOTALL)
    if m:
        str= re.sub(r'\D*(\d+)\D*', r'OrderQty \1 Units', m.group(2))
        text = m.group(1) + str + m.group(3)
    return text
  • re.match
    将输入的
    text
    分为三个子字符串: 要修改的感兴趣部分、前导子字符串和 后面的子字符串
  • 我使用了
    \s
    而不是
    (空白)来匹配换行符
  • 感兴趣的部分由
    m.groups(2)
    捕获。那我们就可以 使用
    re.sub()
    函数对其进行修改
  • 最后的
    文本
    是上述子字符串的串联
[更新]

请您尝试以下方法:

def process_QtyOrd(text):
    text = re.sub(r'(qtyord\s*\d+\s*units|\d+\s+units|qtyord\s+\d+)', lambda m: re.sub(r'\D*(\d+)\D*', r'QtyOrd \1 Units', m.group(1)), text, flags=re.IGNORECASE|re.DOTALL)
    return text
def process_QtyOrd(text):
    text = re.sub(r'(qtyord\s*\d+(?:\.\d+)?\s*units|\d+(?:\.\d+)?\s+units|qtyord\s+\d+(?:\.\d+)?)', lambda m: re.sub(r'\D*(\d+(?:\.\d+)?)\D*', r'QtyOrd \1 Units', m.group(1)), text, flags=re.IGNORECASE|re.DOTALL)
    return text
现在,如果文本包含多个模式,它将起作用。我已将替换文本中的单词
OrderQty
更改为
QtyOrd

  • 我使用了
    re.sub()
    函数一次替换文本中出现的所有图案
  • 引入lambda函数来评估替换零件作为 表情
[Update2]

如果要包含十进制数,请尝试以下操作:

def process_QtyOrd(text):
    text = re.sub(r'(qtyord\s*\d+\s*units|\d+\s+units|qtyord\s+\d+)', lambda m: re.sub(r'\D*(\d+)\D*', r'QtyOrd \1 Units', m.group(1)), text, flags=re.IGNORECASE|re.DOTALL)
    return text
def process_QtyOrd(text):
    text = re.sub(r'(qtyord\s*\d+(?:\.\d+)?\s*units|\d+(?:\.\d+)?\s+units|qtyord\s+\d+(?:\.\d+)?)', lambda m: re.sub(r'\D*(\d+(?:\.\d+)?)\D*', r'QtyOrd \1 Units', m.group(1)), text, flags=re.IGNORECASE|re.DOTALL)
    return text

其概念是将
\d+
替换为
\d+(?:\.\d+)
,它匹配数字,后跟可选的点和数字。

代码运行正常。仅就其他数字而言,它也添加到了QtyOrd和Unit中。对于例如,“零件号-001A说明20个单元其他3毫米说明”=>“零件号-001A说明QtyOrd 20个单元其他QtyOrd 3毫米说明”。QtyOrd和Unit应仅用于数值,而不用于任何其他数值。输入文本可能包含大量数值。但这只会增加Quantity@SafayetKarim抱歉,第二个备选方案不需要可选组。我已经更新了代码和演示。对于text8,它应该是QtyOrd 20个单位,而不是OrderQty 20个单位。您的预期结果显示“OrderQty 20个单位”从text1到text7,而只有text8包括“QtyOrd 20个单位”。有什么规则可以改变?对不起。我想我把输出写错了。我需要所有的文字应该是QtyOrd和单位之前和之后的数量。我已经检查了代码是一行工作良好。但如果我想改变多行,那么它只适用于第一行。P