【问题标题】:Regex to join numbers when they have spaces between them正则表达式在数字之间有空格时加入数字
【发布时间】:2011-10-19 06:55:11
【问题描述】:

我正在尝试构建一个正则表达式,当它们之间有空格时将数字连接到字符串中,例如:

$string = "I want to go home 8890 7463 and then go to 58639 6312 the cinema"

正则表达式应该输出:

"I want to go home 88907463 and then go to 586396312 the cinema"

正则表达式可以是 python 或 php 语言。

谢谢!

【问题讨论】:

  • "(\d) (\d)",然后用"\1\2" 替换? (无论如何,使用 Python 风格的正则表达式)
  • @Thomas,不,不适用于1 2 3,对于这种情况,您需要至少使用一次环视。
  • @tugaPT,像foo123 5bar 这样的字符串呢,也应该加入吗?

标签: php python regex replace preg-replace


【解决方案1】:

使用前瞻来查看下一个块是否是一组数字并删除尾随空格。这样,它适用于任意数量的集合(我怀疑你可能想要):

$string = "I want to go home 8890 7463 41234 and then go to 58639 6312 the cinema";

$newstring = preg_replace("/\b(\d+)\s+(?=\d+\b)/", "$1", $string);
// Note: Remove the \b on both sides if you want any words with a number combined.
// The \b tokens ensure that only blocks with only numbers are merged.

echo $newstring;
// I want to go home 8890746341234 and then go to 586396312 the cinema

【讨论】:

  • 我会使用更像/(?<=\d)\s+(?=\d)/ 的东西,替换为空字符串。
  • @Qtax 这对变量空间是一个很好的建议,但是,我注意到如果我只想组合 only 数字的块,我需要\b结束。这意味着您不能使用后视,因为后视必须使用固定宽度。如果不需要该要求,您的建议是一个很好的建议。
  • 是否需要\b 令牌?似乎/(\d)\s+(?=\d)/ 在您的正则表达式中也能正常工作。
  • @Benjam - 请参阅替换下方的注释。你拥有的是我最初拥有的,但这意味着将合并具有数字和字母的块。我添加了\b 和注释,以防提问者关心这种情况。
  • @Reensis - 是的,我在发表评论后不久就注意到了。不过谢谢你的回复。
【解决方案2】:

Python:

import re
text = 'abc 123 456 789 xyz'
text = re.sub(r'(\d+)\s+(?=\d)', r'\1', text)  # abc 123456789 xyz

这适用于任意数量的连续数字组,中间有任意数量的间距。

【讨论】:

  • 我收到以下语法错误: output = re.sub(r'(\d+)\s+(?=\d)', r'\1', output)
  • 文件“stack04.py”,第 35 行结果 = re.sub(r'(\d+)\s+(?=\d)', r'\1', outp) ^ SyntaxError:语法无效
  • 我已经用 Renesis 解决了我的问题,但错误输出是:pastebin.com/0p8RBTWZ,无论如何,谢谢。
  • @tugaPT:我看到你接受了一个答案,但我想满足我对你为什么会出错的好奇心(我没有在我的机器上);-) 看起来它可以是一个缩进问题(即混合空格与制表符)。不知道还有什么可能。
  • 看来python对空格很敏感,仔细检查代码并删除一些多余的空格后它起作用了,谢谢!
猜你喜欢
  • 2022-11-24
  • 1970-01-01
  • 2023-01-16
  • 1970-01-01
  • 2019-10-16
  • 1970-01-01
  • 2014-06-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多