python正则表达式仅在括号中替换

时间:2018-05-17 02:56:22

标签: python regex

我想在$urls[] = 'http://site1.com'; $urls[] = 'http://site2.com'; foreach($urls as $url) { $output = getMainPage($url, $zids, $listing_count, array(), array()); } print_r($output); //Line 1 function getMainPage($url, $zids, $listing_count, $ids = array(), $names = array()) { $dom = new DOMDocument; @$dom->loadHTML($html); $links = $dom->getElementsByTagName('a'); $output_html = ''; foreach ($links as $link){ print_r($ids); //Line 2 $output['ids'][] = $this_id; $output['$names'][] = $this_name; $listing_count++; $output['listing_count'] = $listing_count; if(strpos($href, 'next') !== FALSE) { $url = $next_url; $o = getMainPage($url, $output['zids'], $output['listing_count'], $output['ids'], $output['names']); $output['ids'] = array_merge($output['ids'], $o['ids']); $output['names'] = array_merge($output['names'], $o['names']); } } return $output; 这样的正则表达式中将替换为。我试过了\d+(ー)\d+(ー)\d+,但它会替换包括数字在内的所有文字。是否可以仅替换括号中的单词?

e.g。 re.sub返回sub('\d+(ー)\d+(ー)\d+','4ー3ー1','-')。假设不能使用简单的'4-3-1',因为有其他replace不满足正则表达式。我目前的解决方案是拆分文本并在满足正则表达式的部分进行替换。

3 个答案:

答案 0 :(得分:1)

您可以使用replre.sub参数的函数来触摸匹配组。

import re s = '1234ー2134ー5124' re.sub("\d+(ー)\d+(ー)\d+", lambda x: x.group(0).replace('ー', '-'), s)

使用略有不同的模式,您可以利用超前表达式,该表达式不会消耗它匹配的字符串部分。也就是说,前瞻/后瞻将匹配一个模式,条件是它也匹配前瞻/后瞻表达式中的组件(而不是整个模式。)

re.sub("ー(?=\d+)", "-", s)

如果你可以使用emdash之前部分的固定长度表达式,你可以将前瞻与后瞻相结合,使正则表达式更加保守。

re.sub("(?<=\d)ー(?=\d+)", "-", s)

答案 1 :(得分:1)

您可以在此处使用群组参考。

import re
before = '4ー3ー1ーー4ー31'
after  = re.sub(r'(\d+)ー(\d+)ー(\d+)', r'\1-\2-\3', before)
print(after)  # '4-3-1ーー4ー31'

这里,r'\1'是第一组的引用,a.k.a,第一个括号。

答案 2 :(得分:0)

re.sub('\d+(ー)\d+(ー)\d+','4ー3ー1','-')

正如您所指出的,正则表达式的输出将为“ - ”。因为你试图用' - '替换整个模式。将ー替换为 - 你可以使用

import re
input_string = '4ー3ー1'
re.sub('ー','-', input_string)

或者你可以在数字上找到所有数字并使用' - '

连接字符串
'-'.join(re.findall('\d+', input_string))

这两种方法都应该给你'4-3-1'