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

Python 如何使用正则表达式更改字符串中的数字,python,regex,python-2.7,python-3.x,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

我有一根像

'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
它还我

['5"x3"x10"', '7" x 4"x 2"', '1"x 4"x 2"']
[('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"']
它不包含任何数字..如何将字符串转换为所需的数字?
有什么帮助吗?

如果你真的想在一个步骤中完成,你必须做多个lookahead/lookbehind来解释所有的案例(如果所有的案例都是通过这一步捕获的,这是一个问题):

如果将其拆分为一个多步骤过程,可能会更快(更容易捕获异常值)

说明:


这里有两种搜索模式,
(?zwer显然是regex的大师。但是,您可能会对另一种方法感兴趣,这种方法有时可以使用更简单的表达式。它涉及使用
re
模块识别要更改的字符串,然后使用Python函数进行操作

在这种情况下,我们希望识别带或不带小数的数字,后面总是跟着
x
有时前面或后面有一个或多个空格。此代码使用带有可选表达式的正则表达式来查找这两个空格,将找到的内容传递给
replacer
,并将其留给此函数以丢弃不需要的字符

>>> 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

一节中Python文档的详细信息,我在这里不会太复杂

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

(\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演示

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

好了,你会慢慢习惯正则表达式的语法;)谢谢,我会的,但是当我尝试添加
6“x4”x2
时,它给了我..
1.5x3x10嘿7x4x2.9.5x7.5是7.1x4x2,你是6x4x2“。当我添加时,我们剩下的对话
,即留下一个
在end@PaulNicolashunter它在
\'1.5“x3”x10“hey 7”x 4“x 2”上的性能与预期一致,9.5“x 9.5”x 7.5“是7.1”x 4“x 2”您是6“x 4”x 2“。以及我们对话的其余部分
字符串。如果您在最后一个
2”
字符串之间添加一个空格,它将生成您的结果(因为它试图不删除单词之间的空格)。您可以通过在接受的字符类中为第一个模式中的先行查找匹配一个点来纠正它:
((?这两种方法都很酷..尽管我是regex的新手,你能告诉我,我要花多少时间才能成为你和zwer这样的大师吗?无论如何,谢谢你的回答,我以后会记住这个方法:)我不是大师!我总是发现自己在检查文档。我担心这和其他任何事情一样。这要看情况。我要花多长时间才能学好法语?可能永远!这可能是显而易见的。订阅这里的regex帖子,并尝试尽可能多地回答你能负担得起的问题。我保证我会……)谢谢你的新方法,我会记住这一点,以备将来参考:)
 (                             # (1 start)
      \d+ 
      (?: \. \d+ )?
      (?:
           \s* " \s* x \s* 
           \d+ 
           (?: \. \d+ )?
      ){2}
      \s* "
 )                             # (1 end)
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