공백을 밑줄로 바꾸려면 어떻게해야합니까?


221

멋진 URL을 만들기 위해 문자열에서 공백을 밑줄로 바꾸고 싶습니다. 예를 들어 :

"This should be connected" becomes "This_should_be_connected" 

Django와 함께 Python을 사용하고 있습니다. 정규식을 사용하여이 문제를 해결할 수 있습니까?


1
django 템플릿에서 어떻게 이것을 할 수 있습니까? 공백 을 제거 하는 방법이 있습니까? 이를 위해 내장 된 태그 / 필터가 있습니까? 참고 : slugify원하는 출력을 제공하지 않습니다.
user1144616

답변:


375

정규식이 필요하지 않습니다. 파이썬에는 필요한 것을 수행하는 내장 문자열 메소드가 있습니다.

mystring.replace(" ", "_")

29
\ t 또는 공백이 아닌 다른 공백 문자와는 작동하지 않습니다.
Roberto Bonvallet

12
예, 맞습니다. 그러나 질문의 ​​목적 상 다른 공간을 고려할 필요는 없습니다.
rogeriopvl 2016 년

1
이 기능을 사용하려면 가져 오기가 필요합니까? 다음과 같은 오류가 발생합니다. AttributeError : 'builtin_function_or_method'개체에 'replace'특성이 없습니다.
Ocasta Eshu

2
replace라는 변수가 문자열 유형이 아닐 수 있습니다.
Snigdha Batra

4
이 대답은 혼동 될 수 있습니다. 문자열을 직접 변경하지 않고 변경된 버전을 반환하므로 mystring = mystring.replace ( "", "_")로 더 잘 작성하십시오.
Mehdi

79

공백을 바꾸는 것은 좋지만 물음표, 아포스트로피, 느낌표 등과 같은 다른 URL 적대적 문자를 처리하는 것이 좋습니다.

또한 SEO 전문가들 사이의 일반적인 합의 는 URL에서 밑줄보다 대시가 선호된다는 것입니다.

import re

def urlify(s):

    # Remove all non-word characters (everything except numbers and letters)
    s = re.sub(r"[^\w\s]", '', s)

    # Replace all runs of whitespace with a single dash
    s = re.sub(r"\s+", '-', s)

    return s

# Prints: I-cant-get-no-satisfaction"
print(urlify("I can't get no satisfaction!"))

이건 재미 있네. 나는이 조언을 확실히 사용할 것이다.
Lucas

urlify ()의 출력을 urllib.quote () 기억하십시오-s가 ASCII가 아닌 것을 포함하면 어떻게됩니까?
zgoda

1
이것은 훌륭하지만 \ W가있는 첫 번째 RE는 공백제거 하여 후속 RE는 대체 할 것이 없습니다. 토큰 사이에 다른 문자를 '-'로 바꾸려면 첫 번째 RE가 a로 바뀝니다. : 즉 S =의 re.sub는 (R \ "W", "& NBSP '는, S) (이것에 유래에 shonky 포맷 문제가 될 수있다 - 지시 된 바와 같이 단일의 공간 meta.stackexchange.com/questions/105507/... )
tiluki

2
@Triptych 무슨 뜻인가요? 아프리카 또는 유럽 제비?
tiluki

1
이것에 대한 또 다른 약간의 문제는 URL에서 기존의 하이픈을 제거하여 사용자가 깔끔하게 업로드하기 전에 URL 문자열을 정리하려고 시도하면 thisisclean으로 제거됩니다. 따라서 s = re.sub (r '[^ \ w \ s-]', '', s)입니다. 한 단계 더 나아가 앞뒤 공백을 제거하여 파일 이름이 s = re.sub (r '[^ \ w \ s-]', '', s)와 함께 하이픈으로 끝나거나 시작하지 않도록 할 수 있습니다. ()
Intenex

42

Django는이를 수행하는 'slugify'기능과 다른 URL 친화적 인 최적화 기능을 가지고 있습니다. 기본 필터 모듈에 숨겨져 있습니다.

>>> from django.template.defaultfilters import slugify
>>> slugify("This should be connected")

this-should-be-connected

이것은 정확히 요청한 결과는 아니지만 IMO는 URL에 사용하는 것이 좋습니다.


흥미로운 옵션이지만 맛의 문제이거나 밑줄 대신 하이픈을 사용하면 어떤 이점이 있습니까? 방금 Stackoverflow가 제안한대로 하이픈을 사용한다는 것을 알았습니다. 그러나 digg.com은 예를 들어 밑줄을 사용합니다.
Lucas

이것이 선호되는 옵션 (AFAIK)입니다. 문자열을 가져 와서 슬러그 화하고 SlugField에 저장 한 다음 모델의 get_absolute_url ()에서 사용하십시오. 인터넷에서 쉽게 예제를 찾을 수 있습니다.
shanyu 2016 년

3
@Lulu 사람들은 검색 엔진이 대시를 단어 구분 기호로 취급하기 때문에 대시를 사용하므로 여러 단어 검색에서 더 쉬운 시간을 얻을 수 있습니다.
제임스 베넷

@Daniel Roseman 동적 변수와 함께 사용할 수 있습니다. 나는 진실로 동적 웹 사이트를 문자열로 얻는 것처럼
임시

이것이 정답입니다. URL을 삭제해야합니다.
kagronick

40

이것은 공백 이외의 공백 문자를 고려하며 re모듈을 사용하는 것보다 빠릅니다 .

url = "_".join( title.split() )

4
더 중요한 것은 모든 공백 문자 또는 공백 문자 그룹에서 작동합니다.
dshepherd

이 솔루션은 모든 공백 문자를 처리하지는 않습니다. (예 \x8f)
Lokal_Profil

잘 잡아라, @Lokal_Profil! 이 문서 에서는 어떤 공백 문자를 고려해야하는지 지정하지 않습니다.
xOneca

1
split ()은 기본 "공백 분할"동작을 사용할 때 빈 항목을 반환하지 않으므로이 솔루션은 반복 구분 기호도 유지하지 않습니다. 즉, 입력이 "hello, (6 spaces) world"이면 "hello, ______ world"가 아니라 "hello, _world"가 출력됩니다.
FliesLikeABrick

20

re모듈 사용 :

import re
re.sub('\s+', '_', "This should be connected") # This_should_be_connected
re.sub('\s+', '_', 'And     so\tshould this')  # And_so_should_this

위와 같이 여러 공간이나 다른 여백 가능성이 없다면 string.replace다른 사람들이 제안한대로 사용 하는 것이 좋습니다.


고마워요, 이것이 바로 내가 요구 한 것입니다. 그러나 "string.replace"가 내 작업에 더 적합 해 보인다는 데 동의합니다.
Lucas

도대체, 나는 이것을 공표하려고했지만, 어떤 이유로 든 투표가 중단되었고 이제 내 투표가 잠겨 있습니다. 죄송합니다. Jarret.
Dave Liu

10

문자열의 replace 메소드를 사용하십시오.

"this should be connected".replace(" ", "_")

"this_should_be_disconnected".replace("_", " ")


6

놀랍게도이 라이브러리는 아직 언급되지 않았습니다

python-slugify라는 python 패키지는 꽤 훌륭하게 처리합니다.

pip install python-slugify

다음과 같이 작동합니다.

from slugify import slugify

txt = "This is a test ---"
r = slugify(txt)
self.assertEquals(r, "this-is-a-test")

txt = "This -- is a ## test ---"
r = slugify(txt)
self.assertEquals(r, "this-is-a-test")

txt = 'C\'est déjà l\'été.'
r = slugify(txt)
self.assertEquals(r, "cest-deja-lete")

txt = 'Nín hǎo. Wǒ shì zhōng guó rén'
r = slugify(txt)
self.assertEquals(r, "nin-hao-wo-shi-zhong-guo-ren")

txt = 'Компьютер'
r = slugify(txt)
self.assertEquals(r, "kompiuter")

txt = 'jaja---lol-méméméoo--a'
r = slugify(txt)
self.assertEquals(r, "jaja-lol-mememeoo-a") 

5

친숙한 URL에 다음 코드를 사용하고 있습니다.

from unicodedata import normalize
from re import sub

def slugify(title):
    name = normalize('NFKD', title).encode('ascii', 'ignore').replace(' ', '-').lower()
    #remove `other` characters
    name = sub('[^a-zA-Z0-9_-]', '', name)
    #nomalize dashes
    name = sub('-+', '-', name)

    return name

유니 코드 문자에서도 잘 작동합니다.


1
내장 된 장고 슬러그 파이 기능과 다른 점을 설명해 주시겠습니까?
Andy Baker

4

파이썬에는 replace라는 문자열에 내장 메소드가 있습니다.

string.replace(old, new)

따라서 다음을 사용합니다.

string.replace(" ", "_")

나는이 문제를 얼마 전에 가지고 있었고 문자열의 문자를 대체하는 코드를 작성했습니다. 파이썬 문서는 모든 기능을 내장하고 있기 때문에 파이썬 문서를 확인하는 것을 기억해야합니다.


3

OP는 파이썬을 사용하고 있지만 자바 스크립트에서는 구문이 비슷하므로주의해야합니다.

// only replaces the first instance of ' ' with '_'
"one two three".replace(' ', '_'); 
=> "one_two three"

// replaces all instances of ' ' with '_'
"one two three".replace(/\s/g, '_');
=> "one_two_three"

3
mystring.replace (" ", "_")

이 값을 변수에 할당하면 작동합니다

s = mystring.replace (" ", "_")

기본적으로 mystring은 이것을 갖지 않습니다.



-3
perl -e 'map { $on=$_; s/ /_/; rename($on, $_) or warn $!; } <*>;'

일치 및 대체 공간> 현재 디렉토리에있는 모든 파일의 밑줄

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.