Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中特定字符串的正则表达式问题_Python_Regex - Fatal编程技术网

python中特定字符串的正则表达式问题

python中特定字符串的正则表达式问题,python,regex,Python,Regex,我对python中的正则表达式有问题。我有字符串: 'aaabbbb'、'AaaBbbCcc'、'OneTwost.Three' 我想得到: `'Aaa Bbb', 'Aaa Bbb Ccc'` and 'One Two st.Three' or 'One Two st. Three' 通常,我需要在每个大写字母之前插入空格(如果大写字母之前是空格以外的另一个符号),如果字符串中存在。(点)然后将空格2位置向后插入 我对re-library很在行。我试着根据堆栈中关于regex的几个主题来做

我对python中的正则表达式有问题。我有字符串:

'aaabbbb'、'AaaBbbCcc'、'OneTwost.Three'

我想得到:

`'Aaa Bbb', 'Aaa Bbb Ccc'` 
and 'One Two st.Three' or 'One Two st. Three'
通常,我需要在每个大写字母之前插入空格(如果大写字母之前是空格以外的另一个符号),如果字符串中存在。(点)然后将空格2位置向后插入

我对re-library很在行。我试着根据堆栈中关于regex的几个主题来做这件事,但我不明白这一点。有人知道怎么做吗?

你可以用

(?<=\S)(?=[A-Z])|(.{2}\.)
产生

Aaa Bbb
Aaa Bbb Ccc
One Two st. Three
你可以用

(?<=\S)(?=[A-Z])|(.{2}\.)
产生

Aaa Bbb
Aaa Bbb Ccc
One Two st. Three

根据你所说的你想要的和你说“我有字符串”的事实:

我有绳子

“Aaa Bbb”,“AAABBCC”,“一对三”

这些应该可以做到

输入:

>>> import re
>>> string = """'Aaa Bbb', 'AaaBbbCcc' ,'OneTwost.Three'"""
>>> re.sub(r'((?<![\',\s])[A-Z]+|[\S]{2}\.)', r' \1', string)
"'Aaa Bbb', 'Aaa Bbb Ccc' ,'One Two st. Three'"
输出:

>>> import re
>>> string = """'Aaa Bbb', 'AaaBbbCcc' ,'OneTwost.Three'"""
>>> re.sub(r'((?<![\',\s])[A-Z]+|[\S]{2}\.)', r' \1', string)
"'Aaa Bbb', 'Aaa Bbb Ccc' ,'One Two st. Three'"
输出

>>> re.sub(r'(?<!^)(?<!,)(?<!\s)(?<!\')([A-Z]+|[\S]{2}\.)', r' \1', string)
"'Aaa Bbb', 'Aaa Bbb Ccc' ,'One Two st. Three'"


>>> re.sub(r'(?:(?<!^)(?<!,)(?<!\s)(?<!\'))([A-Z]+|[\S]{2}\.)', r' \1', 
string)
"'Aaa Bbb', 'Aaa Bbb Ccc' ,'One Two st. Three'"


>>> re.sub(r'(?<!^)(?<!,)(?<!\s)(?<!\')([A-Z]+|[\S]{2}\.)', r' \1', string_1)
'Aaa Bbb, Aaa Bbb Ccc ,One Two st. Three'


>>> re.sub(r'(?:(?<!^)(?<!,)(?<!\s)(?<!\'))([A-Z]+|[\S]{2}\.)', r' \1', string_1)
'Aaa Bbb, Aaa Bbb Ccc ,One Two st. Three'
>>re.sub(r'(?)?
  • 使用
    ”(?
    
  • 使用“[\S]{2}\”
  • 我的意思是,如果发现任何2个“非空白字符”后跟“.”,则执行捕获
  • 最后一个“
    ””
    结束捕获组指令
  • 对于第二个参数“r'\1'”,我的意思是打印您捕获的第一个组(在本例中,我只有一个捕获组),并在其前面放置一个空格
  • 编辑:对以下2个可作用于字符串_1的内容进行轻微解释

    • 我发誓,
      re.sub
      的lookarounds行为是不可靠的。鉴于您下面的评论。通过每个
      (?),我告诉re.sub如果大写字母前面有指定字符,则本质上不要捕获。
      (?)但是,如果捕获组出现在行的开头,则表示不捕获

    • 另外请注意,在本例的字符串中,我已从您给出的字符串中删除了


    基于您所说的您想要的,以及您所说的“我有字符串”:

    我有绳子

    “Aaa Bbb”,“AAABBCC”,“一对三”

    这些应该可以做到

    输入:

    >>> import re
    >>> string = """'Aaa Bbb', 'AaaBbbCcc' ,'OneTwost.Three'"""
    
    >>> re.sub(r'((?<![\',\s])[A-Z]+|[\S]{2}\.)', r' \1', string)
    "'Aaa Bbb', 'Aaa Bbb Ccc' ,'One Two st. Three'"
    
    输出:

    >>> import re
    >>> string = """'Aaa Bbb', 'AaaBbbCcc' ,'OneTwost.Three'"""
    
    >>> re.sub(r'((?<![\',\s])[A-Z]+|[\S]{2}\.)', r' \1', string)
    "'Aaa Bbb', 'Aaa Bbb Ccc' ,'One Two st. Three'"
    
    输出

    >>> re.sub(r'(?<!^)(?<!,)(?<!\s)(?<!\')([A-Z]+|[\S]{2}\.)', r' \1', string)
    "'Aaa Bbb', 'Aaa Bbb Ccc' ,'One Two st. Three'"
    
    
    >>> re.sub(r'(?:(?<!^)(?<!,)(?<!\s)(?<!\'))([A-Z]+|[\S]{2}\.)', r' \1', 
    string)
    "'Aaa Bbb', 'Aaa Bbb Ccc' ,'One Two st. Three'"
    
    
    >>> re.sub(r'(?<!^)(?<!,)(?<!\s)(?<!\')([A-Z]+|[\S]{2}\.)', r' \1', string_1)
    'Aaa Bbb, Aaa Bbb Ccc ,One Two st. Three'
    
    
    >>> re.sub(r'(?:(?<!^)(?<!,)(?<!\s)(?<!\'))([A-Z]+|[\S]{2}\.)', r' \1', string_1)
    'Aaa Bbb, Aaa Bbb Ccc ,One Two st. Three'
    
    >>re.sub(r'(?)?
    
  • 使用
    ”(?
    
  • 使用“[\S]{2}\”
  • 我的意思是,如果发现任何2个“非空白字符”后跟“.”,则执行捕获
  • 最后一个“
    ””
    结束捕获组指令
  • 对于第二个参数“r'\1'”,我的意思是打印您捕获的第一个组(在本例中,我只有一个捕获组),并在其前面放置一个空格
  • 编辑:对以下2个可作用于字符串_1的内容进行轻微解释

    • 我发誓,
      re.sub
      的lookarounds行为是不可靠的。鉴于您下面的评论。通过每个
      (?),我告诉re.sub如果大写字母前面有指定字符,则本质上不要捕获。
      (?)但是,如果捕获组出现在行的开头,则表示不捕获

    • 另外请注意,在本例的字符串中,我已从您给出的字符串中删除了


    • 谢谢你的帮助。这对我来说很有魔力。你知道如何考虑特定的字母吗?比如波兰单词:“Ttt?”老实说,关于你的第二个问题,我不知道你是什么意思,但我会发表另一条评论,看看这是否有帮助。我试过了,但波兰语字母使正则表达式中断。对那个人感到抱歉。我的意思是,现在你的正则表达式在每个大写字母前插入空格(包括第一个单词)我需要的解决方案是跳过第一个单词,在每个大写字母(如您的代码)和大写波兰语字母(“ŚĆŻŹĄĘŁÓŃ”)前插入空格,在点符号(“.”)前插入两个字符谢谢你的帮助。这对我来说是很神奇的。你有没有想过怎样去考虑特定的字母,比如波兰单词:“Ttt?”?老实说。关于你的第二个问题,我不知道你的意思,但我会发表另一条评论,看看这是否有帮助。我尝试过,但波兰语字母使正则表达式中断。对不起那个人。我的意思是,现在你的正则表达式在每个大写字母前插入空格(包括第一个单词)我需要的解决方案是跳过第一个单词,在每个大写字母(如您的代码)和大写波兰语字母(“ŚĆŻŹĄĘŁÓŃ”)前插入空格,在点符号(“.”)前插入两个字符。