在Python中使用正则表达式在数字数量值前后添加数量标识符
我在Python中使用正则表达式在数字数量值前后添加数量标识符 基本上,我必须添加QtyOrd和Units单词,它不在文本中的数字数量之后 例如:在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
'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*
-第1组(用替换模式中的(\d+)
表示):一个或多个数字\1
-一个可选组,匹配零个或多个空格和(?:\s*单位)?
字(如果您还想匹配单位
,请在单位
后添加
)?
-或|
-第2组(用替换模式中的(\d+)
引用):一个或多个数字\2
-零个或多个空格和\s*单位
字(如果您还希望以单数形式匹配单位
,请在单位
后添加
)?
-组结束)
-单词边界\b
订购数量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函数来评估替换零件作为 表情
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