我正在读取一个文件,并尝试用该匹配替换每次出现的正则表达式匹配,但剥离了空白区域。例如,在我的文档中正确匹配的正则表达式是([0-9] + \ s(st | nd | rd | th))'以便表格文件中的任何内容......
第1,第2,第33,第134等将匹配。
我想要的是简单地写一个新文件,其中每个出现在原始文件中,替换为删除的空格。
我玩了一些像re.findall和re.sub这样的东西,但是我无法弄清楚如何编写完整的文档但只更换了没有空格的子串匹配。
感谢您的帮助。
答案 0 :(得分:2)
替换为删除的空白区域。
尝试使用Non-capturing group。
(?:\d+)\s+(?:(st|nd|rd|th))
上面的正则表达式将捕获数字之间的空格,后跟st,nd,rd,th中的任何一个。现在只需用空字符串替换所有空格。
答案 1 :(得分:2)
如果我理解正确,您可以使用re.sub
来实现此目的。
不是在整个模式周围放置一个捕获组,而是在数字周围放置一个,在选定文本周围放置另一个,省略空格。
>>> import re
>>> text = 'foo bar 1 st, 2 nd, 33 rd, 134 th baz quz'
>>> re.sub(r'([0-9]+)\s+(st|nd|rd|th)\b', '\\1\\2', text)
另一种方法是使用lookarounds。
>>> re.sub(r'(?<=[0-9])\s+(?=(?:st|nd|rd|th)\b)', '', text)
输出
foo bar 1st, 2nd, 33rd, 134th baz quz
答案 2 :(得分:1)
没有捕获组的另一个技巧。您需要在正则表达式中添加单词边界,以仅匹配数字与st或nd或ed或th字符串之间的空格。在替换部分中,匹配的空格将替换为空字符串(即,通过re.sub
删除匹配的空格)
>>> import re
>>> text = 'foo 1 st, 2 nd, 33 rddfa,33 rd,bar 134 th'
>>> re.sub(r'(?<=\d)\s+(?=(?:st|nd|rd|th)\b)', r'', text)
'foo 1st, 2nd, 33 rddfa,33rd,bar 134th'