Python 除了字符串中匹配的模式外,如何将字符串中的连字符(-)替换为空格?

Python 除了字符串中匹配的模式外,如何将字符串中的连字符(-)替换为空格?,python,regex,Python,Regex,我有类似的字符串 text='Studied b-tech from college in 2010-13' 使用 将产生 于2010年在大学学习理工学士13 但我想要的是: 于2010-13年在大学学习理工学士 我已经准备了下面的模式,用于像2010-13这样的grepping令牌,但是我如何在代码中使用它呢 regex_pattern='(\d{4}-\d{2,4})' replace的第三个可选参数允许您指示要替换的实例 text.replace('-',' ', 1) Pyt

我有类似的字符串

text='Studied b-tech from college in 2010-13'
使用

将产生

于2010年在大学学习理工学士13
但我想要的是:

于2010-13年在大学学习理工学士
我已经准备了下面的模式,用于像
2010-13
这样的grepping令牌,但是我如何在代码中使用它呢

regex_pattern='(\d{4}-\d{2,4})'

replace
的第三个可选参数允许您指示要替换的实例

text.replace('-',' ', 1) 

Python的字符串
replace
采用
max
参数,表示要替换的最大出现次数

text.replace('-',' ', 1) 

如果您只想第一次使用
text.replace(*,1)

我会在正则表达式上使用Python的
.replace()

比如:

str.replace(旧的、新的[,最大值])


其中
max
是要替换的实例数。但是,如果您只是想替换非数字字符串的连字符,我将使用类似于此问题的内容:将其更改为捕捉连字符旁边的字符是否为数字。

我想您要查找的是:

>>> import re
>>> text = "Studied b-tech from college in 2010-13"

>>> re.sub("\-([a-zA-Z]+)", r"\1", text)
"Studied btech from college in 2010-13"

[a-zA-Z]
将与
-
后面的数字不匹配。您可以找到有关
re.sub

的更多信息,只需匹配反模式即可

正则表达式:
(\d{0,3}(?:\d}^)\d{0,3})-(\d?(?:\d}$)\d?


替换:
$1$2

您必须描述使用负面环视的连字符的两种可能性:

  • 前面没有四位数字:
  • 后面没有两个或四个数字:
    (?![0-9]{2}(?[0-9]{2})?\b)
(“不加A不加B”是对“加A后加B”的否定)

例如:

import re

text = 'Studied b-tech from college in 2010-13'

result = re.sub(r'-(?:(?<!\b[0-9]{4}-)|(?![0-9]{2}(?:[0-9]{2})?\b))', ' ', text)
重新导入
text=“2010-13年从大学学习b-tech”

result=re.sub(r'-(?:(?

你能做
text.replace('b-tech','b-tech')吗
?或者您需要替换更多的输入吗?就像2010-13之外的所有输入一样?如果字符串是:
text='2010-13 b-tech大学学习
我想您的意思是
text='2010-13 b-college大学学习b-tech'
?如果是这样,它仍然不起作用。您已经更改了要求,请更新原始问题。这不是我的问题:)我只是在想,如果OP想要一种方法来删除所有不用于日期的连字符实例,那么应该有一种比替换第一个实例更好的方法。很抱歉,我最初没有注意到您不是原始海报。这是正确的,上面的
替换
仅用于第一个实例,并且假设日期为not首先。他需要一个正则表达式来处理更多实例,但忽略日期。OP没有指定顺序是否会更改。没问题:)我认为@Ozgur在这里有一个完美的答案。这是正确的答案。我想
.replace()
会起作用,但如果使用条件,它会变得太疯狂。我认为这是最可靠的答案。不过有一个问题。
(?这个表达式似乎给出了相同的答案,但更接近于您所说的效率较低的选项。您能详细说明为什么效率较低吗?我的正则表达式非常幼稚。@rwhit2049:
(?)是错误的,因为它与
abc-12
1234 abc
12345-6789
之类的内容不匹配。关于为什么
-(?:(?)比
更有效(?:第一种方法在第二种方法需要测试
-
时快速丢弃非
-
的位置(?即使对于
-
的位置也是如此)(在这种情况下,第二个分支也会被测试,并且会在
-
上失败)。此外,一般来说,以交替开始的模式速度较慢。