REGEX-NP ++-使用一个正则表达式从代码子组中删除填充0s

时间:2019-01-24 17:31:49

标签: python regex notepad++ pcre

这是我的第一个主题问题,在此先感谢您的帮助以及您花时间阅读我的内容
我在NP ++下工作,尝试一些正则表达式

我想要的东西

我想用比下面的更有吸引力和更聪明的正则表达式将这些行(从)转换为格式化的行(至)(请参阅无吸引力的解决方案

(来自)=>(至)

H04B0001240000; => H04B 1/24;  
H04B0010300000; => H04B 10/30;  
H04B0011301000; => H04B 11/301;  
H04B0111300000; => H04B 111/30;  
H04B0101303400; => H04B 101/3034;  
H04B0100300010; => H04B 100/30001;  
H04B0110300000; => H04B 110/30;  

如何进行?

-对于给定的代码,规则是
H04B0001240000;
-分为4、4和6三个部分
H04B 0001/240000;
-在第二组的开头处撤回所有填充0(第二组至少应有一个数字)
H04B 1/240000;
-提取第三组末尾的所有填充0(第三组至少应有两位数字)
H04B 1/24;

因此,被认为无用的0位于第二组的开始和第三组的末尾。填充0的数量在变化...

没有吸引力的解决方案

在NP ++下,我找到了一种没有吸引力的解决方案
在“搜索”字段中:

([A-Z])((?:0{3}([1-9]))|(?:0{2}([1-9][0-9]))|(?:0([1-9][0-9]{2})))([0-9]{2})([0-9]*[1-9])?0{1,4}(;)

在“替换”字段中:

\1 \3\4\5\/\6\7\8

H04B 0001/240000;的解释
==============================
([A-Z])表示从A到Z的一个大写字母,与第一组的最后一个字母(H04B)匹配

((?:0{3}([1-9]))|(?:0{2}([1-9][0-9]))|(?:0([1-9][0-9]{2})))应该匹配0002或0020或0201,但不能匹配2011。它与检测第二组(0001)有关

([0-9]{2})([0-9]*[1-9])?0{1,4}(;)与第三组6位数字(240000)有关,目的是在最后丢弃所有填充0。第三组至少应包含两位数字([0-9] {2})

最终问题

您知道一种更有吸引力,更聪明的Regex可以达到预期的结果吗?

1 个答案:

答案 0 :(得分:0)

您可以这样做

(?m)^(\S{4})0*(\d\d*?)(?<=^.{8})(\d{2}\d*?)0*;

https://regex101.com/r/7pTjkB/2

 (?m)
 ^ 
 ( \S{4} )                     # (1)
 0*
 ( \d  \d*? )                  # (2)
 (?<= ^ .{8} )
 (                             # (3 start)
      \d{2} 
      \d*? 
 )                             # (3 end)
 0*
 ;                             # Or, (?<= ^ .{14} )

或者,像这样

(?m)^(\S{4})0*(\d\d*?)(?<=^.{8})(\d{2}\d*?)0*(?<=^.{14})

https://regex101.com/r/7pTjkB/3

 (?m)
 ^ 
 ( \S{4} )                     # (1)
 0*
 ( \d  \d*? )                  # (2)
 (?<= ^ .{8} )
 (                             # (3 start)
      \d{2} 
      \d*? 
 )                             # (3 end)
 0*
 (?<= ^ .{14} )