我有一个类似的字符串..
'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"']
它不包含任何数字。我可以将我的字符串转换为所需的字符串吗? 有什么帮助吗?
答案 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函数进行操作。
在这种情况下,我们希望识别带或不带小数的数字,后跟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
“sudo apt list "*nvidia-[0-9][0-9][0-9]"
。
答案 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