【问题标题】:Regex to replace 4.7uF to 4U7正则表达式将 4.7uF 替换为 4U7
【发布时间】:2016-05-19 11:42:43
【问题描述】:

我正在与正则表达式作斗争。是否可以使用正则表达式将电子元件值从标准形式解析为简写形式:

 4.7pF    >  4P7
 16.2kΩ   >  16K2
 22.6nH   >  22N6

理想情况下,正则表达式会找到小数点后的字母,并将其插入小数点的位置。如果我们能去掉单位的尾随字母/符号也很好。

到目前为止,我正在匹配十进制数字,但不确定如何在匹配组之后 获取字母,然后不知道如何进行替换。

干杯

【问题讨论】:

  • 正则表达式('一般')不支持大小写更改。为此使用 Python,如 stackoverflow.com/q/4145451/2564301
  • 电子元件值是否已经在单独的字符串或更大的字符串中(与其他内容)?

标签: python regex


【解决方案1】:

在 Python 中,你可以使用

result = re.sub(r'(\d+)(?:\.(\d+))(\w).*', r"\1\3\2", test_str).upper()

Ideoene Demo

【讨论】:

  • 回复非常迅速,非常简洁,谢谢。似乎适用于小数点前后的任意位数。
【解决方案2】:

这是一个 Python 完整的解决方案:

import re
p = re.compile(r'\D*(\d+)\.(\d+)(\S).*')
strs = ["4.7pF", "16.2kΩ", "22.6nH"]
result = [p.sub(lambda m: "{0}{1}{2}".format(m.group(1),m.group(3).upper(),m.group(2)), x) for x in strs]
print(result) # => ['4P7', '16K2', '22N6']

regex demo 在这里。

正则表达式匹配前导非数字(0 或更多),然后捕获 1+ 数字,匹配点,捕获 1 或更多数字,然后捕获 1 个非空白字符。

在代码中,re.sub 方法内部使用了一个 lambda 表达式来构造所需的替换字符串。

【讨论】:

  • 不需要这么复杂(至少在这里)
  • 让我知道这里有什么复杂之处,我会解释
  • 好吧不是那样complex complex..我只是说它也可以简单地完成..虽然这些是相对术语..
  • 好吧,也许就目前的情况而言,它可能有点太多了。但是,它是一种通用方法(如果只有一个捕获应该更改而其他捕获不应该)。
  • 这就是我在评论中提到(at least here) 的原因。我知道你的解决方案是通用的
【解决方案3】:

使用以下搜索:

([0-9]*)\.([0-9]*)(.).*(demo)

然后将其替换为\1\3\2。这不会改变代表单位的字母的大小写。不知道怎么做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-05
    • 1970-01-01
    • 1970-01-01
    • 2016-07-17
    • 2012-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多