如何使用正则表达式更改字符串中的数字

时间:2017-05-27 15:46:16

标签: python regex python-2.7 python-3.x

我有一个类似的字符串..

'1.5"x3"x10" hey 7" x 4"x 2" how 9.5" x 9.5" x 7.5" are 7.1"x 4"x 2" you ..and rest of our conversation

我想要的是将字符串转换为..

'1.5x3x10 hey 7x4x2 how 9.5x9.5x7.5 are 7.1x4x2 you.. and rest of our conversation

简而言之,要删除数字之间的空白和" ..

我试图通过这样做来找到模式..

stuff = re.findall('(\d+\.\d+|\d+)?["]\s?x\s?(\d+\.\d+|\d+)?["]\s?x\s?(\d+\.\d+|\d+)?["]',strings)
print sub

它让我回头

[('1.5', '3', '10'), ('7', '4', '2'), ('9.5', '9.5', '7.5'), ('7.1', '4', '2')]

所以我试过了,

stuff = re.findall('\d+["]\s?x\s?\d+["]\s?x\s?\d+["]',strings)
print stuff

它让我回头

['5"x3"x10"', '7" x 4"x 2"', '1"x 4"x 2"']

它不包含任何数字。我可以将我的字符串转换为所需的字符串吗? 有什么帮助吗?

3 个答案:

答案 0 :(得分:1)

如果你真的想一步到位,那么你必须做多个前瞻/后视来解释所有情况(如果所有这些情况都被捕获,那就是一个问题):

<

得到你:

import re

my_str = '\'1.5"x3"x10" hey 7" x 4"x 2" how 9.5" x 9.5" x 7.5" are 7.1"x 4"x 2" you ..and rest of our conversation'

mod_str = re.sub(r'(?<=[\dx])["\s]+(?=[x\s])|(?<=x)\s(?=\d)', '', my_str)
print(mod_str)

如果要将其拆分为多步骤过程,它可能会更快(并且更容易捕获异常值)。

说明:

这里有两种搜索模式,'1.5x3x10 hey 7x4x2 how 9.5x9.5x7.5 are 7.1x4x2 you ..and rest of our conversation (?<=[\dx])["\s]+(?=[x\s]),它们由(?<=x)\s(?=\d)分隔,表示一种或另一种(从左到右的方式,所以如果第一种组捕获第二个未被执行的内容。)

第一个:

|

第二个:

(?<=            positive non-capturing lookbehind, capture the next segment only if match
  [\dx])        match a single digit (0-9) or the 'x' character
)
  ["\s]+        match one or more " characters or whitespace
(?=             positive non-capturing lookahead, capture the previous segment only if match
  [x\s]         match a single whitespace or 'x' character
)

第一个用于选择数字周围的空格和引号,第二个用于选择&#34; x&#34;只有数字后跟数字才能增加第一个模式的不足。它们一起匹配正确的引号和空格,然后使用(?<= positive non-capturing lookbehind, capture the next segment only if match x match the 'x' character ) \s match a single whitespace (?= positive non-capturing lookahead, capture the previous segment only if match \d match a single digit (0-9) ) 方法将其替换为空字符串。

答案 1 :(得分:1)

zwer显然是正则表达式的主人。但是,您可能会对替代方法感兴趣,这种方法有时可以使用更简单的表达式。它涉及使用"模块来识别要更改的字符串,然后使用Python函数进行操作。

在这种情况下,我们希望识别带或不带小数的数字,后跟xreplacer有时在一个或多个空格之前或之后。此代码使用带有替代表达式的正则表达式来查找两者,将它找到的内容传递给>>> import re >>> quest = '1.5"x3"x10" hey 7" x 4"x 2" how 9.5" x 9.5" x 7.5" are 7.1"x 4"x 2" you ..and rest of our conversation' >>> def replacer(matchobj): ... for group in matchobj.groups(): ... if group: ... return group.replace(' ', '').replace('"', '') ... >>> re.sub(r'([0-9\.]+\")|(\s*x\s*)', replacer, quest) '1.5x3x10 hey 7x4x2 how 9.5x9.5x7.5 are 7.1x4x2 you ..and rest of our conversation' 并将其留给此函数以丢弃不需要的字符。

sub

sudo apt list "*nvidia-[0-9][0-9][0-9]"

部分的Python文档中的详细信息

答案 2 :(得分:1)

我不会在这里变得太复杂。

我只是一次匹配一组维度然后替换空格和双引号。

(\d+(?:\.\d+)?(?:\s*"\s*x\s*\d+(?:\.\d+)?){2}\s*")

扩展

 (                             # (1 start)
      \d+ 
      (?: \. \d+ )?
      (?:
           \s* " \s* x \s* 
           \d+ 
           (?: \. \d+ )?
      ){2}
      \s* "
 )                             # (1 end)

Python demo http://rextester.com/HUIYP80133

Python代码

import re

def repl(m):
    contents = m.group(1)
    return re.sub( r'[\s"]+','', contents )

str = '\'1.5"x3"x10" hey 7" x 4"x 2" how 9.5" x 9.5" x 7.5" are 7.1"x 4"x 2" you ..and rest of our conversation'

newstr = re.sub(r'(\d+(?:\.\d+)?(?:\s*"\s*x\s*\d+(?:\.\d+)?){2}\s*")', repl, str)

print newstr

输出

'1.5x3x10 hey 7x4x2 how 9.5x9.5x7.5 are 7.1x4x2 you ..and rest of our conversation