在re.sub

时间:2015-05-08 08:47:48

标签: python regex

在我的程序中,我正在解析日语定义,我需要解决一些问题。我需要做三件事来解决问题。 「text」 (text) 《text》

在我「」之间取消sentence = re.sub('「[^)]*」','', sentence)之间的事情「」问题是,出于某种原因,如果sentence = re.sub('([^)]*)','', sentence)中有括号,它将不会取代任何内容。另外,我尝试使用相同的代码来处理其他两个问题,例如sentence = re.sub('《[^)]*》','', sentence) parse = re.findall(r'「[^」]*」','', match.text) if len(str(parse)) > 8: sentence = re.sub(r'「[^」]*」','', match.text) 但由于某种原因它不起作用。没有错误或任何东西,它只是不替换任何东西。

我怎样才能做到这一点,或者有更好的方法来做到这一点?

修改

我对此另一部分有轻微问题。在我更换任何东西之前,我检查长度以确保它超过一定长度。

Traceback (most recent call last):
  File "C:/Users/Dominic/PycharmProjects/untitled9/main.py", line 48, in <module>
    parse = re.findall(r'「[^」]*」','', match.text)
  File "C:\Python34\lib\re.py", line 206, in findall
    return _compile(pattern, flags).findall(string)
  File "C:\Python34\lib\re.py", line 275, in _compile
    bypass_cache = flags & DEBUG
TypeError: unsupported operand type(s) for &: 'str' and 'int'

这似乎现在导致错误:

function GetWtiLikeCount($post_id) {
global $wpdb;
$show_symbols = get_option('wti_like_post_show_symbols');
$wti_like_count = $wpdb->get_var("SELECT SUM(value) FROM {$wpdb->prefix}wti_like_post WHERE post_id = '$post_id' AND value >= 0");
if (!$wti_like_count) {
$wti_like_count = 0;
} else {
if ($show_symbols) {
$wti_like_count = "+" . $wti_like_count;
} else {
$wti_like_count = $wti_like_count;
}
}
return $wti_like_count;
}
/**
* Get unlike count for a post
* @param $post_id integer
* @return string
*/
function GetWtiUnlikeCount($post_id) {
global $wpdb;
$show_symbols = get_option('wti_like_post_show_symbols');
$wti_unlike_count = $wpdb->get_var("SELECT SUM(value) FROM {$wpdb->prefix}wti_like_post WHERE post_id = '$post_id' AND value <= 0");
if (!$wti_unlike_count) {
$wti_unlike_count = 0;
} else {
if ($show_symbols) {
} else {
$wti_unlike_count = str_replace('-', '', $wti_unlike_count);
}
}
return $wti_unlike_count;
}

我有点理解造成这种情况的原因,但我不明白为什么它只是从那个微小的变化中起作用。我知道re.sub部分很好,这只是引起问题的前两行。

2 个答案:

答案 0 :(得分:2)

您应该阅读有关正则表达式的教程,以便了解正则表达式的作用。

正则表达式'「[^)]*」'匹配不是右括号的角度之间的任何内容。你需要这个:

sentence = re.sub(r'「[^」]*」','', sentence)

第二个正则表达式还有一个问题:圆括号具有特殊含义(当它们在方括号内时),因此要匹配括号,需要写\(和{{1 }}。所以你需要这个:

\)

最后:您应该始终为python regexp使用原始字符串。在这种情况下,它不会发生变化,但它经常会发生变化,并且这些错误令人抓狂。例如,使用:

'\([^)]*\)'

答案 1 :(得分:0)

sentence = re.sub(ur'「[^」]*」','', sentence)

                       ^^

您需要将negatiion based quantifer更改为而不是)

如果处理它们,您应该使用unicode标记。如果其中有),那么它会因您使用「[^)]*」

而失败
                ^^

您已指示正则表达式在找到)时停止。